配置 conda build 以从 conda 包输出中排除某些文件夹

Posted

技术标签:

【中文标题】配置 conda build 以从 conda 包输出中排除某些文件夹【英文标题】:Configure conda build to exclude some folders from the conda package output 【发布时间】:2019-07-30 00:04:46 【问题描述】:

tl;博士:

如何排除文件夹被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

有些文件夹之所以存在,是因为它们在原型设计过程中很有用,但我不想从存储库中删除它们。

如何从 conda 构建的包中排除文件夹(如 inputnotebooks)及其内容?

关于信息,我使用以下命令构建:

$ conda build some_folder_name

【问题讨论】:

build: "include_recipe": false 有效,但它也不包括meta.yaml,我想保留它。 看看这是否有帮助? @NiklasR、***.com/questions/47935680/… 和 docs.conda.io/projects/conda-build/en/latest/resources/… 我在 Anaconda 公共论坛上收到了 Michael Sarahan 的回答:“您需要更改 build.sh/bld.bat 以在这些脚本结束之前从 $PREFIX 中删除文件。您也可以使用显式输出 (docs.conda.io/projects/conda-build/en/latest/resources/…)。 你可以为自己的问题写一个答案。 实际上,我从来没有真正找到我的问题的确切解决方案......我不得不改变我的文件夹的结构...... 【参考方案1】:

我认为最好的方法是创建一个目录recipe/ 并将与配方相关的文件移动到那里。 然后将 meta.yaml 更改为

source:
    path: ./..

所以只有配方目录的内容会被 conda 复制到包中。 其次,文件夹notebooksinput 只有在 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

【讨论】:

【参考方案2】:

我正在寻找答案,我发现的所有内容都已在问题的评论中。由于这些解决方案似乎有效(未达到预期但仍然有效),我将在此处进行解释。 我在一个测试项目上尝试了第二种解决方案,它可以工作。我还是不习惯 conda。

第一:显式输出

显式文件列表:

显式文件列表是构建前缀根的相对路径。显式文件列表支持 glob 表达式。还支持目录名称,它们递归地包含内容。

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

Specifying files to include in output

第二:忽略前缀文件

要指定单个文件名,请使用:

build:   ignore_prefix_files:
- file1

Ignore prefix files

我没有尝试 Michael Sarahan 的答案,但如果正确完成它应该可以工作。

“您需要更改 build.sh/bld.bat 以在这些脚本结束之前从 $PREFIX 中删除文件。”

【讨论】:

【参考方案3】:

我在尝试解决类似问题时遇到了这个帖子。由于我的 meta.yaml 位于项目根目录的子文件夹中,并且我只想排除不属于 repo 的文件(例如 .tox 文件夹),因此我最终使用存储库本身来指定要包含的文件如下:

...  
source:
    git_url: ..
...

注意:

.tox 文件夹实际上并未包含在最终的 conda 包中 - 我只是想避免让 conda-build 无缘无故地复制一个大文件夹。 可以通过让您的附加项目仅存在于 repo 的特定分支中并使用没有这些项目的不同分支进行构建来实现您想要的 - 有关详细信息,请参阅 the docs。

【讨论】:

以上是关于配置 conda build 以从 conda 包输出中排除某些文件夹的主要内容,如果未能解决你的问题,请参考以下文章

当使用 conda-build 构建 conda 包并且我的代码使用纯 python 库时,我需要在 meta.yaml 文件中的 build/host/run 中放入啥?

使用 conda build 制作编译包

在安装 conda 包期间更新 @INC 变量

使用 conda-build 从相同的源代码构建两个具有不同要求的包

从本地 C++ 程序构建 conda 包

conda-build 使用旧的(陈旧的)setup.py