我想找到在python sdist中包含未被git跟踪的文件的正确方法.
上下文.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
那么,有没有一种正确的方法来处理这种情况?