我正在尝试使用Ant和MSBuild自动化我的项目(包括java和.net)的构建过程。我已经阅读了它们并知道如何在Ant和MSBuild中编写构建脚本。但我想知道,是否有编写构建脚本的指南或最佳实践?以下是我发现的两个,但我想听听其他开发者的更多信息。
我也见过this post,但它在编写任务的过程中有详细说明。如上所述,我需要更高级别的指导方针。
以下是我从答案中收集的指南:
clean
目标。 compile
,package
和test
目标。答案 0 :(得分:4)
对上面提到的第二个要点进行评论:
如果项目包含一组子系统,并且每个子系统都有 自己的构建脚本,项目的构建文件应该只调用 构建子系统的脚本。
每个子系统都应该有自己的构建文件,但该文件应该导入一个公共构建文件。公共构建文件将包含诸如编译,测试,包等目标。
http://ant.apache.org/manual/Tasks/import.html
子系统构建文件非常简单,不包含重复,只包含特定于该子系统的信息(例如compile.classpath)。
答案 1 :(得分:4)
如果您正在构建VisualStudio应用程序,最好使用msbuild
而不是Ant。 msbuild
命令将使用开发人员创建的解决方案文件进行构建,并基本上模拟他们所做的相同构建。
如果您真的想要自动化所有内容,请查看Jenkins。它有一个可以执行msbuild
的插件,并会在每次有人进行更改时自动触发构建。我使用了msbuild
和Ant与Jenkins的组合。我使用msbuild
进行构建,然后使用Ant来收集和压缩所有构建的工件。然后,人们可以直接从Jenkins下载构建的工件。
现在,使用Java应用程序,您将不得不使用Ant。我使用以下指南
clean
目标。此目标将删除在构建过程中添加的所有文件,并将工作目录返回到clean
之前的状态。target
目录中。这样,我的清洁命令可以简单地执行<delete dir="${target.dir}/>
并清理所有内容,并且闪闪发光。build.xml
文件。我的主build.xml
文件只调用所有子项目'build.xml
文件。答案 2 :(得分:1)
在MSBuild中,目标应尽可能指定输入和输出(以启用依赖项计算)。如有必要,请使用Returns属性指定返回与用于依赖项计算的项目不同的项目。
应使用项目转换(用于简单的基于路径的转换)或其他目标(用于更复杂的转换)生成给定目标的输入和输出项目。
对于MSBuild pre-4.x,对于您在.targets文件中定义的目标,请考虑使用以下模式使消费者能够在您定义的目标之前注入自己的目标:
<PropertyGroup>
<MyTargetDependsOn>
Target1;
Target2;
SomeOtherTarget
</MyTargetDependsOn>
</PropertyGroup>
<Target
Name="MyTarget"
DependsOnTargets="$(MyTargetDependsOn)">
</Target>
这使消费者只需修改MyTargetsDependsOn属性的值,就可以在指定目标之前注入自己的目标:
<PropertyGroup>
<MyTargetDependsOn>
$(MyTargetDependsOn);
YetAnotherTarget
</MyTargetDependsOn>
</PropertyGroup>
<Target
Name="YetAnotherTarget">
</Target>
在MSBuild 4.x中,您只需使用BeforeTargets和AfterTargets属性。