【问题标题】:Do python projects need a MANIFEST.in, and what should be in it?python 项目是否需要 MANIFEST.in,其中应该包含什么?
【发布时间】:2014-09-03 20:22:04
【问题描述】:

“Python 分发”指南(位于 python-distribute.org,但该注册已失效)告诉我将 doc/txt 文件和 .py 文件排除在 MANIFEST.in 文件中

sourcedist documentation 告诉我只有 sdist 使用 MANIFEST.in 并且只包含您指定的文件并包含 .py 文件。它还告诉我使用:python setup.py sdist --manifest-only 生成 MANIFEST,但 python 告诉我这不存在

我很欣赏这些来自不同版本的 python 并且分发系统在一个 完全一团糟,但假设我使用的是 python 3 和 setuptools (包括分发但现在称为 setuptools 的新版本,而不是旧的 setuptools 已被弃用的分发工具只被带回分发和分发重命名为 setuptools.. ...)

我遵循“标准”文件夹结构和setup.py 文件,

  1. 我需要MANIFEST.in 吗?
  2. 里面应该有什么?
  3. 什么时候将所有这些不同的封装系统和方法整合到一个简单的过程中?

【问题讨论】:

    标签: python setuptools


    【解决方案1】:

    回复:“我需要 MANIFEST.in 吗?

    不,您不必使用MANIFEST.indistutilssetuptools 都包含在源代码中 分发包setup.py中提到的所有文件-模块,打包python文件, README.txttest/test*.py。如果这是您想要在分发包中拥有的所有内容,您可以 不必使用MANIFEST.in

    如果您想操作(添加或删除)要包含的默认文件,您必须使用MANIFEST.in

    Re:里面应该有什么?

    程序很简单:

    1. 确保在您的setup.py 中包含(通过setup 参数)您认为对程序运行很重要的所有文件(模块、包、脚本...)

    2. 澄清,是否有一些文件要添加或一些文件要排除。如果两者都不需要,则无需使用MANIFEST.in

    3. 如果需要MANIFEST.in,请创建它。通常,你添加tests*/*.py文件,README.rst如果你不使用README.txtdocs文件,如果需要的话,可能还有一些数据文件用于测试套件。

    例如:

    include README.rst
    include COPYING.txt
    

    要对其进行测试,请运行python setup.py sdist,并检查在dist/ 下创建的压缩包。

    所有这些不同的包系统何时会...

    比较今天和 2 年前的情况 - 情况要好得多 - setuptools 是要走的路。你可以忽略这个事实,distutils 有点破旧,是setuptools 的低级基础,因为setuptools 会负责对你隐藏这些东西。

    编辑:最后几个项目我使用pbr 构建具有三行setup.py 的分发包,其余位于setup.cfgrequirements.txt。无需关心MANIFEST.in 和其他奇怪的东西。尽管该软件包应该得到更多的文档。见http://docs.openstack.org/developer/pbr/

    【讨论】:

    • 在我有限的经验中,如果你想包含不在 python 模块内的文件(带有 init.py 的目录),你必须使用 MANIFEST.in 和使用sdist(意思是:源码分发)命令。如果您认为 bdistbdist_wheelbinary 并且只打算安装在您的 python 路径中,这是有道理的。 (这些非模块文件和目录会去哪里?在/usr/local/lib/python2.7/dist-packages/?当然不是。)但值得一提的是,看到创建的档案令人困惑并且它们不包含文件。
    • 为了阻止不可避免的package_datadata_files 建议,这些建议超出了范围,我将继续。 package_data 列出了与您的包一起安装的文件到 dist-packages/yourpackage 中,因为没有 *.py 名称,所以会被跳过。 data_files 列出了安装在你的包之外的文件。每个条目指定一个目标路径,如果它是相对的,则以 sys.prefix 为前缀,或者如果它以 / 开头,则直接创建(权限允许)。
    • @JanVlcinsky 重要的是要知道什么是并且[更重要的是] 不包括在不同的分发格式中。我有一个公共项目,我只通过源代码分发进行分发,因为我在包之外(在根目录)包含了一个 boto.sample.cfg 文件(其中包含一个假的 AWS IAM 凭据),并且二进制分发不会包含它。我制作了私有二进制构建以部署到具有 data_files=[('/etc/', ['boto.cfg'])] 的生产环境。如果你想分发非 py 文件,你必须知道这些东西是如何工作的。
    • @MichaelGoerz 老实说,他们不应该这样做。这个答案很古老,建议pbr 也是一个坏主意。
    • @Ame 我同意,事情继续进行。目前我正在将我的大部分项目从 pbr 转换为 poetry
    【解决方案2】:

    老问题,新答案:

    不,您不需要MANIFEST.in。但是,要让setuptools 执行您(通常)的意思,您确实需要使用setuptools_scm,它在两个关键位置扮演MANIFEST.in 的角色:

    • 它确保在运行sdist 命令时打包所有相关文件(其中所有相关文件定义为“源代码管理下的所有文件”)
    • 使用include_package_data 将包数据作为buildbdist_wheel 的一部分包含时。 (再次:源代码控制下的文件)

    MANIFEST.in 的历史理解是:当你没有源代码控制系统时,你需要一些其他的机制来区分“源文件”和“恰好在你的工作目录中的文件”。但是,您的项目受源代码控制(对吗??),因此不需要MANIFEST.inMore info in this article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-17
      • 2011-08-18
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多