Используйте флаг --recursive=False
при вызове crosspm
. Важно - у команд download
и lock
поведение по умолчанию отличается
# сделать lock-файл с пакетами только первого уровня, не рекурсивно
crosspm lock # поведение по умолчанию - только первый уровень
crosspm lock --recursive=False
crosspm lock --recursive False
# проверить правильность и наличие пакетов, рекурсивно
crosspm lock --recursive
crosspm lock --recursive=True
# скачать все дерево пакетов вместе с зависимостями
crosspm download # поведение по умолчанию - рекурсия
crosspm download --recursive
crosspm download --recursive=True
# скачать без зависимостей, только пакеты указанные в dependencies
crosspm download --recursive=False
crosspm download --recursive False
Можно задать неправильные имена файлов dependencies, тогда он не найдет их и не пойдет глубже
cpm:
dependencies: no-dependencies.txt
dependencies-lock: no-dependencies.txt.lock
И вызывать с указанием правильного файла:
crosspm download --depslock-path=./dependencies.txt.lock
Это ограничение запросов AQL в Artifactory - их возможно использовать только с авторизацией. Добавьте в конфиг любые учетные данные для доступа к этим репозиториям
Если формат версии в конфиге определен так:
columns:
version: "{int}.{int}.{int}[-{str}]"
то в dependencies можно указать, что необязательной части шаблона быть не должно. Для этого нужно добавить разделитель из необязательной части в конце маски версии. Несколько вариантов для примера:
PackageName *- R14.1 >=snapshot
PackageName *.*.*- R14.1 >=snapshot
PackageName 14.*.*- R14.1 >=snapshot
Если формат версии в конфиге определен так:
columns:
version: "{int}.{int}.{int}[-{str}]"
то в dependencies можно указать, что необязательная часть шаблона должна быть. Для этого нужно добавить эту необязательную часть в конце маски версии. В таком случае CrossPM не будет брать версии без feature. Несколько вариантов для примера:
Agent *-* R14.1 >=snapshot
Agent *-develop R14.1 >=snapshot
Agent *.*.*-* R14.1 >=snapshot
Agent 14.*.*-* R14.1 >=snapshot
Agent 14.*.*-CERT* R14.1 >=snapshot
Например, формат версий и столбцы для файла dependencies в конфиге вы определили так (через точку с запятой в поле properties отделяются шаблоны для раздичных свойств артефакта, их может быть несколько):
columns: '*package, version, contract.db, contract.be'
parsers:
common:
columns:
version: '{int}.{int}.{int}[.{int}][-{str}]'
repo:
path: '{server}/{repo}/{package}_{version}_[all|amd64].deb'
properties: 'contract.db={contract.db};contract.be={contract.be}'
Под контрактом мы понимаем любые теги в свойстве артефакта с именами, например, “contract.db” (контракт базы) и “contract.be” (контракт бекенда). Например, тут можно указать совместимость с другими артефактами по этому свойству - билд-контракты. Тогда CrossPM сможет искать пакеты из dependencies и фильтровать их по одному или всем свойствам, указанным в отдельных столбцах (свойств может быть больше одного):
# crosspm scheme (see crosspm.yaml):
# packages version contract.db contract.be
# --- DB:
db-config 2.3.0.* hash1 rest2
db-schema 2.4.12.* hash1 rest2
# --- BE:
backend 2.4.* hash1 rest5
backend-doc 2.4.* hash2 rest5
# --- UI:
ui 2.* hash1 *
documentation 2.* * *
Как обычно, звёздочка заменяет поиск по любому значению свойства. В данном абстрактном примере артефакты базы должны быть совместимы с артефактом UI по билд-контракту contract.db=hash1. Сам контракт может быть установлен для артефакта в момент сборки, либо проставлен вручную позже.
Нужно создать “псевдоуникальное имя пакета”. Пример файла dependencies.txt.lock
PackageRelease17 Package 17.0.*
PackageRelease161 Package 16.1.*
OtherPackage OtherPackage *
И добавить в конфиг строки
columns: "*uniquename, package, version" # Указание в какой колонке указано имя пакета
output: # Для упрощения дебага в stdout
tree:
- uniquename: 25
- version: 0
Данная проблема могла наблюдаться в адаптере artifactory, нужно поменять его на artifactory-aql
type: artifactory-aql
С помощью разделения на два файла конфигурации и использования import
Если нужно проверить, что все пакеты используют одну версию пакетов, но загрузить только файлы, указанные непосредственно в dependencies.txt, можно поступить следующим образом:
# CrossPM: lock and recursive check packages
# Попытается сделать lock-файл для пакетов из dep.txt, при этом проверит его зависимости на использование одной версии пакетов
crosspm lock \
dependencies.txt dependencies.txt.lock \
--recursive \
--options cl="gcc-5.1",arch="x86_64",os="debian-8" \
--config=".\crosspm.lock.yaml"
(( $? )) && exit 1
# CrossPM: downloading packages
# Скачает только пакеты, которые указаны в dependencies.txt
crosspm download \
--config=".\crosspm.download.yaml" \
--lock-on-success \
--deps-path=".\dependencies.txt" \
--out-format="cmd" \
--output=".\klmn.cmd" \
--options cl="gcc-5.1",arch="x86_64",os="debian-8" \
(( $? )) && exit 1
На данный момент, если в пути до файла нет версии, например repo/projectname/projectname/projectname.version.zip
То архив разархивируется в папку PROJECTNAME
.
В случае, когда выкачивается архив с новой версией PROJECTNAME
, то он её не разархивирует, т.к. уже существует кэш с именем PROJECTNAME
.
Решение - использовать кастомные пути до распакованных\запакованных файлов:
cache:
storage:
packed: '{package}/{branch}/{version}/{compiler}/{arch}/{osname}/{package}.{version}.tar.gz'
unpacked: '{package}/{branch}/{version}/{compiler}/{arch}/{osname}'
Для этого нужно запустить одну из команд:
# download - без указания --depslock-path
crosspm download --config config.yaml --dependencies-lock-content "boost 1.64.388 1.64-pm-icu" -o os=win,cl=vc140,arch=x86_64
# lock - БЕЗ указания файлов в начале. Создает по итогам файл dependencies.txt.lock
crosspm lock --config config.yaml --dependencies-content "boost 1.64.388 1.64-pm-icu" -o os=win,cl=vc140,arch=x86_64
# usedby - БЕЗ указания файлов в начале
crosspm usedby -c config.yaml --dependencies-content "packagename 1.2.* master"
Для этого нужно задать переменные в конфигурационном файле.
Подробнее можно почитать тут
При выполнении команды crosspm download
печатает сообщения в stderr
(стандартный потом вывода ошибок). Из-за этого сложно понять правильно работает crosspm
или там есть ошибки.
crosspm
ведет себя так для поддержки совместимости с cmakepm (старой версии crosspm
). Cmake
ищет в stdout
пути до пакетов в последних строках - вида PACKAGENAME_ROOT=e:\cache\package\1.2.123
. Поэтому все диагностические сообщения пишем в другой поток - stderr
.
Чтобы сделать поведение “как у других программ” - запустите crosspm
с флагом --stdout
. Тогда диагностические сообщения будут выводиться в stdout
, а ошибки - в stderr
crosspm download --stdout
# ИЛИ можно задать переменную окружения CROSSPM_STDOUT с любым значением
set CROSSPM_STDOUT=1
# set CROSSPM_STDOUT=true
crosspm download # аналогично --stdout
В конфигурационный файл задать этот параметр нельзя, т.к. логирование происходит до прочтения конфигурационного файла.