如何将 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,用户将被提示删除现有的(我想解压到某个用户位置)模板下一个 运行,所以我宁愿避免那个。
- Cookiecutter 版本:1.6.0
- Python版本:3.5
- 设置工具 38.5.1
- 操作系统:Linux
编辑:我也发布了这个 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。
我正在维护一个包含许多实用函数的内部 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,用户将被提示删除现有的(我想解压到某个用户位置)模板下一个 运行,所以我宁愿避免那个。
- Cookiecutter 版本:1.6.0
- Python版本:3.5
- 设置工具 38.5.1
- 操作系统:Linux
编辑:我也发布了这个 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。