我想找到在python sdist中包含未被git跟踪的文件的正确方法。
我的项目中的.mo
文件不会被git
跟踪(就像其他一些需要在安装时创建的.txt
文件一样)。
我在setup.py
编写了一个小函数,以便在安装时创建它们,我在setup()
中调用:
setup(
.
.
.
data_files=create_extra_files(),
include_package_data=True,
.
.
.
)
请注意,它们应属于data_dir
,因为the documentation says:
data_files选项可用于指定所需的其他文件 通过模块分发:配置文件,消息目录, 数据文件,任何不适合以前类别的内容。
因此,这适用于python3 setup.py install
(以及bdist
)。 .mo
文件生成并存储在正确的位置。
但如果我希望它与sdist
一起使用,那么我必须将它们包含在MANIFEST.in
中(例如recursive-include mathmaker *.mo
)。 Documentation says indeed:
3.1版中更改:所有匹配data_files的文件都将添加到MANIFEST文件中 如果没有提供模板。请参阅Specifying the files to distribute。
(链接没有多大帮助)。
我不愿意在*.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
woudl不再提及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
清楚地说明:
$ionicScrollDelegate.scrollTop();
那么,是否有正确的方法来处理这种情况?
答案 0 :(得分:1)
就我的问题而言,您希望添加要与git存储库一起分发的文件,但您不想跟踪它们的更改。
这可以通过以下四个简单步骤来完成:
第0步:
首先确保path/a_file.txt
文件中的内容与您要分发的内容相匹配。据我所知,它不能为空,所以如果您只是希望这个文件存在,请为其添加换行符/空格字符。
第1步:
使用git add path/a_file.txt
第2步:
提交文件(git commit path/a_file.txt
)
第3步:
更新git的索引并告诉git它应该进一步忽略
对文件的更改
git update-index --assume-unchanged path/a_file.txt
如果你想对这个应该再次跟踪的文件做一些更改,你只需使用--no-assume-unchanged
标志来设置它
在git的索引中激活,然后提交更改。
注意创建一个.gitignore
文件,告诉git忽略文件(在克隆存储库的所有计算机上)并使用git add --force path/a_file.txt
将无效git将(force
)将其添加到索引中并跟踪更改。