Мы планируем настроить репозитории conan для наших кодов C ++. Мы хотим предоставить разработчикам только список зависимостей (lib / version @ user / channel), а не логику, которую мы заложили в conanfile.py. Мы планируем так, потому что мы создаем оболочку вокруг conan, которая будет иметь несколько логик и чеки. Эта оболочка будет открыта для пользователей. Им не нужно знать подробную логику и строить шаги.
Есть ли способ реализовать требования (список зависимостей) вне conanfile.py и сделать список доступным для пользователей, чтобы они могли выбирать, какую версию библиотеки они хотят использовать — что-то похожее (но не то же самое) на pom.xml в мире maven?
Я нашел 2 решения:
Создайте список используемых библиотек, а затем прочитайте его из метода требований:
localhost$ cat dependencies.list
lib1/0.0.1@user/stable
lib2/1.6.0@user/stable
lib3/1.5.0@suer/stable
Помните, что в значениях не должно быть кавычек, так как мы передаем их self.requires()
метод. Теперь определите метод требований в conanfile.py
следующим образом:
def requirements(self):
try:
with open("/path/to/dependencies.list") as c:
line=c.readline()
while line:
self.requires(line)
line=c.readline()
except Exception as ex:
print(ex)
Определите метод требований вне conanfile.py. Используйте этот метод, если зависимость от библиотеки является условной.
localhost$ cat requires.py
def requires(self):
self.requires("lib1/0.0.1@user/stable")
self.requires("lib2/2.6.0@user/stable")
if self.options.shared:
self.requires("lib3/1.5.0@user/stable")
else:
self.requires("lib3/1.5.1@user/stable")`
Затем импортируйте метод require и назначьте его методу require в классе conan следующим образом:
from conans import ConanFile, CMake, tools
from requires import requires
class HelloConan(ConanFile):
name = Hello
version = "0.0.1"license = "LICENSE"url = "URL"description = "libHello, Version 0.0.1"settings = "os", "compiler", "build_type", "arch"....
....
Теперь вместо определения метода требований с помощью def require (self), сделайте это:
requirements=requires
....
....
Это оно !! conan install
получит сведения о библиотеке, и если они будут найдены в реестре, они будут установлены !!
Приведенный выше ответ от @ amit-jaim довольно хороший. Я хотел бы указать пару дополнительных деталей:
Необходимо exports
файл .list, так как он будет также использоваться, когда conanfile используется в кеше
Конанфайл можно сделать чуть более питоническим
Код может быть таким:
from conans import ConanFile, loadclass HelloConan(ConanFile):
name = "Hello"version = "0.1"exports = "deps.list"
def requirements(self):
for r in load("deps.list").splitlines():
self.requires(r)
Если вы хотите быть в состоянии запустить conan create
из каталогов, отличных от текущего conanfile, необходимо получить текущее местоположение conanfile, например:
def requirements(self):
f = os.path.join(os.path.dirname(__file__), "deps.list")
for r in load(f).splitlines():
self.requires(r)