Python是这个钉子的正确锤子吗?

Is Python the right hammer for this nail? (build script)

目前我正在使用Windows批处理文件来构建我的软件。它执行诸如运行msbuild、复制文件、创建zip文件、运行一些测试(包括Subversion修订号)等操作。

但问题是,批处理文件是邪恶的。所以我想换个更好的。我计划用Python重新创建构建脚本。这是明智的选择吗?那么所有的构建系统呢,比如ant、scons、maven、rake等等,使用这些系统会是更好的选择吗?

注意:我不打算替换我的Visual Studio解决方案/项目文件。我只想编写创建我的软件版本所需的所有其他脚本。

编辑:我有充分的理由离开批量生产,这不是我的问题所在。我想知道(例如)相对于普通的Python脚本,scons给了我什么。


对于用python编写脚本的工具,我碰巧认为paver比scons更易于管理和更灵活的构建自动机。与scons不同,paver是为大量不编译程序任务而设计的,这些任务与管理和分发软件项目一起进行。


批处理文件并不邪恶——它们实际上是从command.com的"大脑死亡日"开始走了很长一段路。现在,命令语言可以很有表现力,学习它只需要你付出一些努力。

除非你的构建脚本有一个你不能解决的实际问题(如果是这样的话,那就是你应该问的问题,而不是一些一丝不苟的"什么是最好的替代品?":-)我的方法是坚持你现有的。

一种模糊的邪恶感并不能成为我浪费精力去"修复"那些没有被破坏的东西的理由。如果没有一个明显的改变的优势("不那么邪恶"不是我认为的明显优势),这将是浪费精力。


当你提到python和scons时,我会说go for scons。毕竟是Python。是的,上面的任何一个都比手工生成脚本更好。


我见过在其他地方用于构建版本的python脚本,所以它不会是坏的。实际上,我个人使用Perl脚本来自动构建发布。我想任何脚本语言都可以很容易地实现该过程的自动化。如果这很容易做到(而且可能比批处理脚本更好),为什么不试试呢?


我建议在构建脚本中使用nant而不是python。我的理由是:

  • 它已经定义了任务,您只需要编写XML并将其指向正确的位置。如果您与不了解Python的人一起工作,那么XML可能比学习一种新语言更不可怕。
  • Nant是为在Windows.NET环境中工作而设计的,因此它已经可以执行msbuild和nunit任务。
  • 如果你已经用C语言写作了,如果你需要扩展nant来完成新的任务,你就不会在你的项目组合中添加另一种语言。
  • 您可以连接到Cruise Control.net(用于连续构建)。我认为这是你使用南特的主要原因。


我强烈建议看一下WAF。这是您想要的:"一个用于配置、编译和安装应用程序的基于python的框架"


为什么要使用python?如果构建脚本没有损坏,请不要修复它。如果您在更新它以处理新的项目引用时遇到问题,那么您可能需要考虑重写它。虽然像nant或msbuild这样的工具可以做到这一点,但我不会使用python。我不认为使用通用的purpis编程语言来做一些已经被编写成工具要做的事情有什么意义,除非你有很多模糊的需求,现有的工具无法处理。第二,如果你被巴士撞了或者赢了彩票,会发生什么?如果您决定编写所有脚本,我将使用PowerShell或其他特定于Microsoft的技术,因为您已经与Microsoft结婚了。如果您离开,是否会有足够的Python程序员来维护构建脚本?


python非常便携。SCONS经过现场测试且可靠。鉴于你所知道的(从你所解释的),为什么还要问这个问题?

如果你要维护某个东西,不仅要让它构建,还要向用户解释为什么它不能构建,这样可以在帮助用户自救的同时,为你节省大量令人沮丧的问题。

我想不出一个缺乏python的现代生产操作系统,除非你进入嵌入式/研究领域。

所以,我的回答是说,你回答了你自己的问题:)


可以为已安装的Microsoft Nmake工具创建自定义生成文件。使用这样的工具(scons、maven等属于同一类别)可以提供比常规脚本多得多的内容。

主要的好处是跟踪文件之间的依赖关系,以及更改的时间戳。例如,您可以使.zip文件依赖于其他一些文件,因此.zip只有在其中一些文件同时发生更改时才会重新打包。就像源代码及其编译形式一样。


就我个人而言,考虑到这一点,我将使用脚本作为最后的手段

  • 通过一些工作,您可以让msbuild通过使用其他组件扩展它来为您完成所有这些事情。
  • 与mbuild类似的nant也有第三方等价物可以做同样的事情。
  • 有很多像finalbuilder这样的工具也可以做同样的事情,并且更容易配置和扩展

但是,如果我必须使用脚本路径,我将使用PowerShell有以下几个原因:

  • 完全访问文件系统
  • 您可以轻松访问.NET对象
  • 您可以轻松访问COM对象


It does things like running MSBuild, copying files, creating a ZIP file, running some tests, including the subversion revision number, etc.

msbuild和powershell可以用相当干净、简洁的代码轻松地完成所有这些工作。然后你会坚持使用经理们喜欢的纯百万美元的产品。否则,我建议你可以调查Rake,如果不仅仅是针对它的大型社区。它有一个很好的语法和铁红宝石支持(irake)。

老实说,除了前面提到的最后一个任务以外,其他任务都很容易在msbuild中完成。我建议在去其他地方之前先学习一下你拥有的工具。

请访问http://msbuildtasks.tigris.org/了解msbuild的一些好附加组件


这取决于软件使用的技术。如果你正在构建C++程序,我可能会说毫无疑问地去搜索SCONS(除非你有SCONS不能满足的怪异要求)。另一方面,考虑构建C:C harpbuilder的说明。

I would like to know (for example) what SCons gives me, over a normal Python script.

把scons想象成一个图书馆而不是一个程序。它为您提供了代码,可以防止您在没有它的情况下不得不处理大量的单调乏味。在我看来,对于任何类型的shell脚本编写工具来说,普通的python都不是最好的选择(不是它不能做到这一点)。

But the problem is, batch files are evil.

最后,如果批处理文件用于不适合处理的项目,那么它们就是邪恶的。对于一个或两个文件项目,批处理文件做得很好。