Я хотел бы найти правильный способ включения файлов в sidist python, которые не отслеживаются с помощью 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='[email protected]', 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
Итак, есть ли подходящий способ справиться с этой ситуацией?