3

我正在重写我们的NAnt构建脚本,以使它们更简洁、更通用。

我们构建过程中的步骤之一是将某些文件打包成一个 zip 文件。在我们创建一个fileset包含大量文件类型的文件之前,试图捕捉项目中可能存在的所有内容。当我们想在项目中包含非标准文件类型时,这偶尔会导致问题。

我希望我能找到一种方法来创建fileset基于Visual Studio 项目文件 (.csproj) 中列出的文件(以及文件的子集)的方法。zip然后我可以在任务中使用这个文件集。我还没有找到任何可以自动执行此操作的东西(尽管NAntContribSLiNgshoT中现已弃用的任务看起来有点有希望)。

我开始尝试手动执行此操作,但被卡住了。我有一个从解决方案中获取项目的目标(使用regex),然后尝试使用xmlpeek(使用 XPath 查询/n:Project/n:ItemGroup/n:Content/@Include)获取项目中的每个内容文件。这里的问题是它xmlpeek不会返回每个值,只返回第一个值。而且,即使它确实返回了每个值,我也不确定如何fileset从这里把它变成 a 。

有没有办法挽救这种思维轨迹?我可以通过自定义 NAnt 任务完成我想要的吗(我不希望每个项目都依赖于自定义任务)?是否有一些我没有找到的内置方法来做到这一点?

如果我的目标或方法不清楚,请随时在评论中提问。

谢谢!


更新:澄清一下,我的观点是让整个过程更加无缝。虽然我可以轻松地将所有 .xml 文件添加到包中,但这通常会获得位于同一文件夹中但实际上并不是项目的一部分的 .xml 文件。当我已经有了项目使用的文件列表(甚至在内容和其他类型之间分开)时,不使用这些信息似乎很可惜。最终,任何人都不应该接触构建文件来更改包中包含的内容。对我来说,这似乎不是一个白日梦……

4

3 回答 3

2

请参阅此相关问题。microsoft.build.buildengine 界面应该可以让您更好地访问所需的信息,但不幸的是,我认为您必须构建自定义任务。

但是我认为解析一个项目文件以生成一个在其他地方使用的文件集是......将所有内容都放在构建脚本中有点多。而且由于您似乎想重用它,我认为依赖自定义任务并不比任何其他形式的重用更糟糕(即使您可以在现有的 Nant 任务中完成所有操作,您也会仍然需要让每个项目以某种方式继承该过程)。

于 2009-02-12T21:18:35.973 回答
1

至于阅读你的项目文件。我以前做过这样的事情。我最终只是编写了一个程序来读取项目文件并按项目构建文件构建一个自定义项目。

但是我试图编译我的代码库。看起来你只是想压缩它。

考虑到 Zip 任务将允许您在其中运行多个文件集,您可以创建一些通用文件集,然后轻松地为您的特定文件集进行更新。

所以你可以有这样的东西:

<fileset id="project.source.objects">
  <include name="**/*.cs"/>
  <include name="**/*.xml"/>
  <include name="**/*.resx"/>
</fileset>

<fileset id="project.misc.sources">
  <include name="MyFile1.someext"/>
</fileset>

然后在您的 zip 目标中放入:

<zip zipfile="myzip.zip">
  <fileset refid="project.source.objects"/>
  <fileset refid="project.misc.sources"/>
</zip>

现在,如果您想要项目细节。你还可以做另一件事。如果您使用的是 VS2005 或更高版本,请在 T4 上搜索。它是一个用于创建插件的模板框架,允许您在执行某些操作时生成额外的文件。有点像当你做一个类图或有一个 XSD(它得到它的代码隐藏文件,它是通过这种方式完成的)。

在我从事的大多数项目中,我们为每个项目维护一个构建文件并保持最新。由于我们有一个开始的通用文件集,所以我们只需要为晦涩的东西更新文件。

希望有帮助。如果您可以提供更多详细信息,我可能会提供进一步的帮助。

于 2009-02-12T21:49:28.410 回答
0

我喜欢乔希想法的第一部分。

编写一个小型控制台应用程序以从 .csproj 中提取文件(因为它只是其中的 XML)并将列表写入文件。

代替 NAnt 的 zip 任务,我将使用7-zip来创建包含您在上一步中生成的列表的存档:

(我在这里创建一个自解压档案)

<target name="ZipBuild">
  <exec program="${SevenZip}" workingdir="${SolutionPath}/Installation/Build.Staging">
    <arg value="a" />
    <arg value="-sfx" />
    <arg value="ReferenceBuild-${build.number}.exe" />
    <arg value="@mycustomfilelist.txt" />
  </exec>
</target>

希望有帮助,

-杰森

于 2009-02-13T22:13:37.983 回答