Сконфигурируйте сборку conda, чтобы исключить некоторые папки из вывода пакета conda
ТЛ; др:
Как исключить папки из упаковки conda build
?
контекст
Я строю свои первые пакеты с conda build
,
Мой файл meta.yaml выглядит так:
package:
name: 'some_name'
version: {{ load_setup_py_data().get('version') }}
source:
path: ./
build:
script: python setup.py install --single-version-externally-managed --record=record.txt
requirements:
run:
- python >=3.6
- pandas >=0.2
- numpy >=1.12
# Packages that must be installed
# in the user's conda environment
# to run this package.
build:
# Packages used by setup.py
# to install this package.
# May also install compilers
# for non-python code.
- python
- setuptools
И мой корневой каталог (где находятся файлы setup.py & meta.yaml) выглядит так:
$ ls
README.md __pycache__ input isi_classif meta.yaml
notebooks output scripts setup.py version.py
Некоторые папки есть только потому, что они были полезны при создании прототипов, но я не хочу удалять их из репозитория.
Как исключить папку (как input
или же notebooks
здесь) и его содержимое из пакета, который собирает Конда?
Для информации, я строю с помощью следующей команды:
$ conda build some_folder_name
3 ответа
Я наткнулся на эту ветку, пытаясь решить аналогичную проблему. Поскольку мойmeta.yaml
находится в подпапке корня проекта, и я хотел исключить только файлы, которые не были частью репо (например, .tox
folder), я закончил тем, что использовал сам репозиторий, чтобы указать файлы, которые нужно включить, следующим образом:
...
source:
git_url: ..
...
Примечание:
- то
.tox
папка на самом деле не была включена в окончательный пакет conda - я просто хотел избежатьconda-build
скопировать большую папку без уважительной причины. - возможно, удастся достичь того, чего вы хотите, если ваши дополнительные элементы будут жить только в определенной ветке репозитория и использовать другую ветку без этих элементов для вашей сборки - подробности см. в документации.
Я думаю, что лучшим способом было бы создать каталог
recipe/
и переместите туда файлы, связанные с рецептами. Затем измените meta.yaml на
source:
path: ./..
Таким образом, conda скопирует в пакет только содержимое каталога рецептов. Во-вторых, папки
notebooks
а также
input
будут включены только в том случае, если они указаны в setup.py для включения. В противном случае они игнорируются. Поэтому они не устанавливаются как часть
setup.py install
и не будет включено в пакет. Таким образом, ваша исходная структура каталогов будет выглядеть так:
some_folder_name
|--README.md
|--__pycache__
|--input
|--isi_classif
|--recipe
|--meta.yaml
|--notebooks
|--output
|--scripts
|--setup.py
|--version.py
тогда вы все равно можете собрать пакет, используя
conda build some_folder_name
Я ищу ответ, и все, что я нашел, уже было в комментарии к вопросу. Поскольку эти решения кажутся работающими (не такими, как задумано, но все еще работают), я объясню это здесь. Я пробую второе решение на тестовом проекте, и оно работает. Я еще не привык к конде.
Во-первых: явный вывод
Явные списки файлов:
Явные списки файлов - это относительные пути от корня префикса сборки. Явные списки файлов поддерживают глобальные выражения. Имена каталогов также поддерживаются, и они рекурсивно включают содержимое.
outputs: - name: subpackage-name files: - a-file - a-folder - *.some-extension - somefolder/*.some-extension
Скрипты, перемещающие файлы в префикс сборки:
Скрипты, которые создают или перемещают файлы в префикс сборки, могут быть скриптами любого типа. Для известных типов сценариев достаточно указать только имя сценария. В настоящее время список распознанных расширений - это py, bat, ps1 и sh.
outputs: - name: subpackage-name script: move-files.py
Указание файлов для включения в вывод
Во-вторых: игнорировать файлы префиксов
Чтобы указать отдельные имена файлов, используйте:
build: ignore_prefix_files: - file1
Я не пробовал ответить Майкла Сарахана, но он должен работать, если все сделано правильно.
"Вам нужно изменить свой build.sh/bld.bat, чтобы удалить файлы из $PREFIX до завершения этих сценариев".