如何删除构建产品

Posted

技术标签:

【中文标题】如何删除构建产品【英文标题】:How to remove build products 【发布时间】:2015-03-31 15:22:47 【问题描述】:

是否可以自动删除由基于 setuptoolssetup.py 脚本生成的构建产品?

我刚刚开始了一个新的 Python 项目,这是我作为开发人员第一次使用 setuptools,所以我可能会出错。当我使用python setup.py bdist 构建项目时,会创建三个目录builddist 和一个以.egg-info 结尾的目录。然后当我运行python setup.py clean 时,它似乎什么也没做,只是打印出来:

running clean

我尝试将--all 添加到clean 命令中,虽然它确实删除了build 目录中的一些文件,但它不会删除目录本身或其他两个目录中的任何文件。

我假设这应该很容易实现,并且我只是在寻找错误的地方。我已经习惯了这个功能,例如从几乎任何使用 make 的项目中,make cleanmake distclean 将删除任何构建产品。

【问题讨论】:

另见 pypa/setuptools 问题 #1347 github.com/pypa/setuptools/issues/1347 【参考方案1】:

标准方法:

distutils.command.clean

来自Cleaning build directory in setup.py 和documentation:

此命令删除由 build 及其子命令创建的临时文件,例如中间编译的目标文件。使用 --all 选项,将删除完整的构建目录。


另一种方法:

这可能不是最好的解决方案:

从评论below this answer 看来,python setup.py clean --all 有时无法删除所有内容(评论示例中的 Numpy)。

似乎并非所有 setup.py 脚本都支持 clean。示例:NumPy – kevinarpe 2016 年 6 月 15 日 7:14


您可以在安装脚本中使用remove_tree() 命令:

import glob
remove_tree(['dist', glob.glob('*.egg-info')[0],glob.glob('build/bdist.*')[0]]) 

或者在安装脚本中:

from setuptools import setup
from setuptools.command import install 

class PostInstallCommand(install):

    def run(self):
        import glob
        from distutils.dir_util import remove_tree
        remove_tree(['dist', glob.glob('*.egg-info')[0],glob.glob('build/bdist.*')[0]]) 


setup(name='Some Name',
      version='1.0',
      description='A cross platform library',
      author='Simon',
      platforms = ["windows", "mac", "linux"],
      py_modules = ['UsefulStuff', '__init__'],
      cmdclass = 'install':PostInstallCommand
     )

我解决它的另一种方法是手动手动删除所有内容(使用shutil 和glob):

import shutil, glob
shutil.rmtree('dist')
shutil.rmtree(glob.glob('*.egg-info')[0])
shutil.rmtree(glob.glob('build/bdist.*')[0])

将它添加到设置脚本更难,但使用this answer,它应该看起来像这样:

from setuptools import setup
from setuptools.command import install 

class PostInstallCommand(install):

    def run(self):
        import shutil, glob
        shutil.rmtree('dist')
        shutil.rmtree(glob.glob('*.egg-info')[0])
        shutil.rmtree(glob.glob('build/bdist.*')[0])
        install.run(self)



setup(name='Some Name',
      version='1.0',
      description='A cross platform library',
      author='Simon',
      platforms = ["windows", "mac", "linux"],
      py_modules = ['UsefulStuff', '__init__'],
      cmdclass = 'install':PostInstallCommand
     )

cmdclass = 'install' 允许此类在安装后运行。 See this answer for more details.

是什么让我产生了使用 shutil 的想法?

使用shutil的想法来自旧的documentation:

其中一些可以替换为 shutil 模块?

【讨论】:

谢谢你,西蒙!你认为这个问题没有足够的表现来有一个内置的解决方案是有原因的吗?大多数人在这里清理工作没有问题吗?我有点想知道是否有其他方法或工具可以满足这种需求,如果我在这里遇到 X-Y 问题。 @DanielLyons 好吧,我不能肯定地说(我不是 Python 实施者之一),但我可以说我从未遇到过必须进行清理的情况。如果你只是分发包,为什么要清理它呢?毕竟,您可能只是要分发build 文件夹中给出的内容。它更整洁,但再一次,使用您的软件包的开发人员可能只是在安装后删除源代码。第二个python setup.py install 不带其他文件夹。只是 lib/build 文件夹的内容。 所以无论如何你都没有安装你清理的所有东西。至于其他方法或工具。我不知道有任何其他工具可以做到这一点。方法...我在上面尽力了;) @DanielLyons 您可以查看***.com/questions/1594827/… 似乎在那里,通常“接受”的方法是通过问题中使用的命令来执行此操作。可能实施者认为这就足够了。实际上,在投票最高的答案中,您会看到 distutils.command.clear 是使用的标准命令 我不知道,也许有人可以比我更可靠地解释原因。我当然认为保留或删除临时文件夹无论如何都不会产生重大影响。

以上是关于如何删除构建产品的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WiX 安装程序更改添加/删除程序名称?

SAP CX (HYBRIS) : 如何从保存的购物车中删除已删除的产品

如果我不使用 MFC,是不是需要 afxres.h?如何从 .RC 脚本中删除它?

如何从产品页面中删除“标签”块?

清理构建时如何防止删除构建目录?

如何从 Google Play 商店开发者控制台中删除应用内产品