Отделить список зависимостей (требований) от conanfile.py

Мы планируем настроить репозитории conan для наших кодов C ++. Мы хотим предоставить разработчикам только список зависимостей (lib / version @ user / channel), а не логику, которую мы заложили в conanfile.py. Мы планируем так, потому что мы создаем оболочку вокруг conan, которая будет иметь несколько логик и чеки. Эта оболочка будет открыта для пользователей. Им не нужно знать подробную логику и строить шаги.

Есть ли способ реализовать требования (список зависимостей) вне conanfile.py и сделать список доступным для пользователей, чтобы они могли выбирать, какую версию библиотеки они хотят использовать — что-то похожее (но не то же самое) на pom.xml в мире maven?

1

Решение

Я нашел 2 решения:

  1. Создайте список используемых библиотек, а затем прочитайте его из метода требований:

    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)
  1. Определите метод требований вне 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 получит сведения о библиотеке, и если они будут найдены в реестре, они будут установлены !!

1

Другие решения

Приведенный выше ответ от @ 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)
1

По вопросам рекламы [email protected]