我想找到将文件包含在 git 未跟踪的 python sdist 中的正确方法。
语境
我的项目中的.mo
文件没有被跟踪git
(就像其他一些.txt
需要在安装时创建的文件一样)。
我写了一个小函数setup.py
来在安装时创建它们,我调用它setup()
:
setup(
.
.
.
data_files=create_extra_files(),
include_package_data=True,
.
.
.
)
请注意,它们应该属于,data_dir
因为文档说:
data_files 选项可用于指定模块分发所需的其他文件:配置文件、消息目录、数据文件,以及不属于前面类别的任何内容。
因此,这适用于python3 setup.py install
(bdist
也适用于)。.mo
文件生成并存储在正确的位置。
但是,如果我希望它与 一起使用sdist
,那么我必须将它们包含在MANIFEST.in
(例如recursive-include mathmaker *.mo
)中。文档确实说:
在 3.1 版更改:如果没有提供模板,所有匹配 data_files 的文件都将被添加到 MANIFEST 文件 中。请参阅指定要分发的文件。
(该链接没有多大帮助)。
我不愿意在其中包含*.mo
文件,MANIFEST.in
因为 git 不会跟踪它们。而check-manifest不喜欢这种情况,它抱怨这样一个事实lists of files in version control and sdist do not match!
那么,有没有办法解决这个丑陋的情况呢?
重现情况的步骤
环境与项目
为避免污染您的环境,请在您选择的目录中创建并激活专用虚拟环境(python3.4+):
$ pyvenv-3.4 v0
$ source v0/bin/activate
(v0) $
project0
在目录中重现以下树:
.
├── .gitignore
├── MANIFEST.in
├── README.rst
├── setup.py
└── project0
├── __init__.py
├── main.py
└── data
└── dummy_versioned.po
其中README.rst
,__init__.py
和dummy_versioned.po
为空。
其他文件的内容:
.gitignore
:build/ dist/ *.egg-info project0/data/*.txt *~
MANIFEST.in
:recursive-include project0 *.po recursive-include project0 *.txt
main.py
:#!/usr/bin/env python3 # -*- coding: utf-8 -*- def entry_point(): with open('project0/data/a_file.txt', mode='rt') as f: print(f.read())
setup.py
:#!/usr/bin/env python3 # -*- coding: utf-8 -*- import platform from setuptools import setup, find_packages def create_files(): txt_file_path = 'project0/data/a_file.txt' with open(txt_file_path, mode='w+') as f: f.write("Some dummy platform information: " + platform.platform()) return [('project0/data', [txt_file_path])] setup( name='project0', version='0.0.1', author='J. Doe', author_email='j.doe@someprovider.com', url='http://myproject.url', packages=find_packages(), data_files=create_files(), include_package_data=True, entry_points={ 'console_scripts': ['myscript0 = project0.main:entry_point'], } )
启动本地git
仓库:
(v0) $ git init
(v0) $ git add .
安装check-manifest
:
(v0) $ pip3 install check-manifest
安装和测试
install
作品:
(v0) $ python3 setup.py install
.
.
.
copying project0/data/a_file.txt -> build/lib/project0/data
.
.
.
Finished processing dependencies for project0==0.0.1
(v0) $ myscript0
Some dummy platform information: Linux-3.16.0-29-generic-x86_64-with-Ubuntu-14.04-trusty
如果您rm project0/data/a_file.txt
,则myscript0
不再工作,但重新安装它并再次工作,如预期的那样。
构建 sdist 还包括a_file.txt
:
(v0) $ python3 setup.py sdist
.
.
.
hard linking project0/data/a_file.txt -> project0-0.0.1/project0/data
.
.
.
请注意,要将这个文件包含在 sdist 中,看起来有必要(如下面的“上下文”部分所述)recursive-include project0 *.txt
在MANIFEST.in
. 您是否会删除此行,不再python3 setup.py sdist
提及a_file.txt
(不要忘记删除任何以前的build/
或dist/
目录来观察这一点)。
结论
因此,一切都按原样运行,但存在这种差异:a_file.txt
不被 跟踪git
,但被包含在MANIFEST.in
.
check-manifest
清楚地告诉:
lists of files in version control and sdist do not match!
missing from VCS:
project0/data/a_file.txt
那么,有没有合适的方法来处理这种情况呢?