Подтвердить что ты не робот

Как распространять файлы в Python sdist, которые не отслеживаются VCS?

Я хотел бы найти правильный способ включения файлов в 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 installbdist тоже). Файлы .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

Итак, есть ли подходящий способ справиться с этой ситуацией?

4b9b3361

Ответ 1

Насколько я понимаю вашу проблему , вы хотели бы добавить файлы, которые будут распространяться с репозиторией git, но вы не хотите отслеживать их изменения.

Это можно сделать с помощью следующих четырех простых шагов:

Шаг 0: Сначала убедитесь, что содержимое внутри файла path/a_file.txt соответствует содержимому, которое вы хотите распространять. Насколько я знаю, он не может быть пустым, поэтому, если вы просто хотите, чтобы этот файл существовал, добавьте к нему символ новой строки/пробела.

Шаг 1: Добавьте файл в git с помощью 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) добавить его в индекс, а также отслеживать изменения.