【问题标题】:sdist correct but pip install no staticsdist 正确但 pip install 没有静态
【发布时间】:2023-12-09 15:17:01
【问题描述】:

我正在尝试通过 pip(存储在 Pypi 上)提供 Django 应用程序。 问题是当我使用 pip 安装应用程序时,它不包含主指定包内的静态文件夹。

这是我所拥有的:

├── LICENSE.txt
├── MANIFEST.in
├── README.rst
├── setup.cfg
├── setup.py
└── zxcvbn_password
    ├── fields.py
    ├── __init__.py
    ├── static
    │   └── zxcvbn_password
    │       └── js
    │           ├── password_strength.js
    │           ├── zxcvbn-async.js
    │           └── zxcvbn.js
    ├── validators.py
    └── widgets.py

我要做的是:

python setup.py register -r pypi
python setup.py sdist upload -r pypi

正确创建了 tar 存档(它包含静态文件夹),当我从 PyPi 下载相同的存档时,它还包含静态文件夹。但是使用 pip 安装它只会在我的站点包中的zxcvbn_password 中为我提供以下信息:

└── zxcvbn_password
    ├── fields.py
    ├── __init__.py
    ├── validators.py
    └── widgets.py

这就是我编写 setup.py 的方式:

from distutils.core import setup

setup(
    name='django-zxcvbn-password',
    packages=['zxcvbn_password'],
    include_package_data=True,
    url='https://github.com/Pawamoy/django-zxcvbn-password',
    # and other data ...
)

还有我的 MANIFEST.in:

include LICENSE.txt
include README.rst
recursive-include zxcvbn_password/static *

我做错了吗? 为什么pip使用setup.py install时没有安装静态文件夹?

编辑

我添加了从 distutils 导入设置函数的 setup.py 行。
运行 python setup.py sdist upload -r pypitest:
/usr/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'include_package_data'

时收到此警告

【问题讨论】:

  • 不确定是什么原因造成的,但您是否尝试过在清单中“包含静态”。另请查看:packaging.python.org/en/latest/distributing.html
  • 考虑自行回答您的问题,而不是将您的解决方案添加到问题中。在 SE 上,目标是提供一个比较全面的 QA 存档。如果您找到了问题的解决方案,自我回答是非常好的,并且值得鼓励,因为它可以帮助其他人找到您的问题的解决方案。
  • 好的,我会的,谢谢你的解释:)

标签: python pip setuptools pypi


【解决方案1】:

使用 Distutils 的解决方案

# MANIFEST.in

include LICENSE.txt
include README.rst
# recursive-include zxcvbn_password/static *

# setup.py

from distutils.core import setup

setup(
    name='django-zxcvbn-password',
    packages=['zxcvbn_password'],
    package_data={'': ['static/zxcvbn_password/js/*.js']},
    # include_package_data=True,
    url='https://github.com/Pawamoy/django-zxcvbn-password',
    # and other data ...
)

我注释掉了 MANIFEST.in 中的递归包含行和 setup.py 中的 include_package_data=True:如果您在 setup.py 中指定 package_data={...} 行,显然不需要它们。

Setuptools 解决方案

# MANIFEST.in

include LICENSE.txt
include README.rst
recursive-include zxcvbn_password/static *

# setup.py

from setuptools import setup

setup(
    name='django-zxcvbn-password',
    packages=['zxcvbn_password'],
    include_package_data=True,
    url='https://github.com/Pawamoy/django-zxcvbn-password',
    # and other data ...
)

唯一改变的行是from setuptools import setup

结论

我的问题确实来自我导入设置功能的方式。 阅读此内容:Differences between distribute, distutils, setuptools and distutils2?,我了解到 Setuptools 比 Distutils 具有更多功能。

【讨论】: