如何将 cookiecutter 模板包含在 bdist/conda 包中?

How to include a cookiecutter template with a bdist/conda package?

我正在维护一个包含许多实用函数的内部 python 包。作为这个包的一部分,我包含了一个项目生成器 console_script,它使用随包提供的自定义模板调用 cookiecutter。这在使用 pip(基本上,作为 sdist)安装包时工作正常。

我试图让人们尽可能多地使用 conda,所以这很不方便,因为依赖项使用 pip 而不是 conda 获得 resolved/installed。因此,我正在使用 Anaconda 安装中包含的 python setup.py bdist_conda 方式创建一个 conda 包。这适用于另一个内部包。

但是,当我尝试创建当前包时,bdist_conda 创建字节编译包中的所有 python 文件,因此当然(但无意)还有模板文件。由于 jinja 字符串,当 运行ning python setup.py bdist_conda:

时,这会导致语法错误
  byte-compiling build/bdist.linux-x86_64/dumb/home/bilderbuchi/anaconda3/lib/python3.5/site-packages/mypkg/project_template/{{cookiecutter.project_name_simplified}}/{{cookiecutter.project_name_simplified}}.py to {{cookiecutter.project_name_simplified}}.cpython-35.pyc
  File "/path/to/mypkg/project_template/{{cookiecutter.project_name_simplified}}/{{cookiecutter.project_name_simplified}}.py", line 4
    {%- if cookiecutter.command_line_interface == 'argparse' %}
     ^
SyntaxError: invalid syntax

我也可以用普通的 python setup.py bdist 重现,所以我可以排除 conda 是这里的罪魁祸首。 我在基于 setuptools 的 setup.py.

中添加了包含 recursive-include mypkg/project_template *include_package_data = True 的模板文件

有没有一种(更好的)方法可以将 cookiecutter 模板与一些包一起发送?正如我所说,这在与 pip/sdist 一起使用时效果很好,但与 bdist 一起使用时会失败。 或者,有没有办法抑制 bdist 字节编译一组给定的文件?

模板不能放在网上,所以才想打包。 我还考虑过将模板单独放置在其他地方,但是用户在使用项目生成器时依赖于该位置(例如网络驱动器)是否可用。 我考虑过将它添加为一个 zip 文件,但除了从版本控制的角度来看这非常不方便之外,apparently,用户将被提示删除现有的(我想解压到某个用户位置)模板下一个 运行,所以我宁愿避免那个。

编辑:我也发布了这个 in the cookiecutter issue tracker,但到目前为止没有得到任何反馈。

因此,在搜索无果后,我通过将所有 .py 模板文件更改为 .pytemplate 来规避这个问题。这避免了 bdist/bdist_conda 发现它们。我添加了一个 post_gen 脚本,在从模板创建项目后将所有文件重命名回 .py。愚蠢的解决方法,但它有效。 :叹息:

我知道至少对于 bdist,可以通过设置 sys.dont_write_bytecode 来避免编译,但此解决方法不适用于 bdist_conda,请参阅 https://github.com/conda/conda-build/issues/686