【问题标题】:In NAnt, can I create a fileset of the files listed in a VS project?在 NAnt 中,我可以创建 VS 项目中列出的文件的文件集吗?
【发布时间】:2010-10-06 11:30:03
【问题描述】:

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

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

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

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

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

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

谢谢!


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

【问题讨论】:

    标签: .net build-process build-automation nant nantcontrib


    【解决方案1】:

    见this related question。 microsoft.build.buildengine 界面应该可以让您更好地访问所需的信息,但不幸的是,我认为您必须构建自定义任务。

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

    【讨论】:

    • 其他问题中的代码示例应该有助于构建此自定义任务。否则我肯定会走正则表达式和 XML 解析路径。
    【解决方案2】:

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

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

    考虑到 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(它得到它的代码隐藏文件,它是通过这种方式完成的)。

    在我参与过的大多数项目中,我们都会为每个项目维护一个构建文件并使其保持最新状态。因为我们有通用文件集,所以我们只需要更新文件以获取晦涩难懂的东西。

    希望对您有所帮助。如果您能提供更多详细信息,我可能会提供更多帮助。

    【讨论】:

    • 使用命名文件集将不变的通用内容保存在一个地方是个好主意。
    【解决方案3】:

    我喜欢 Josh 想法的第一部分。

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

    我将使用7-zip 来创建包含您在上一步中生成的列表的存档,而不是 NAnt 的 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>
    

    希望对你有帮助,

    -杰森

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 2016-05-22
      相关资源
      最近更新 更多