代码之家  ›  专栏  ›  技术社区  ›  bdukes Jon Skeet

在Nant中,我可以创建一个vs项目中列出的文件集吗?

  •  3
  • bdukes Jon Skeet  · 技术社区  · 16 年前

    我正在重写我们的 NAnt 构建脚本以使它们更清晰、更简单,以及更通用的目的。

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

    我希望能找到一种方法 文件集 基于文件(以及 子集 在Visual Studio项目文件(.csproj)中列出的文件。然后我可以在 zip 任务。我没有发现任何自动执行此操作的内容(尽管现在已弃用 SLiNgshoT 任务在 NAntContrib 看起来有点希望)。

    我开始尝试手动完成这项工作,但却被卡住了。我有一个从解决方案中获取项目的目标(使用 regex ,然后尝试使用 xmlpeek (使用xpath查询 /n:Project/n:ItemGroup/n:Content/@Include )这里的问题是 XMLPEEK 不返回每个值,只返回第一个值。而且,即使它确实返回了每个值,我也不确定如何将其放入 文件集 从这里开始。

    有没有办法挽救这种思维轨迹?我能用定制的nant任务完成我想要的任务吗(我不希望每个项目都依赖于定制的任务)?有没有一些我没有找到的内置方法?

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

    谢谢!


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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    7 年前

    this related question .Microsoft.build.buildEngine接口应该可以让您更好地访问所需的信息,但不幸的是,我认为您必须构建一个自定义任务。

    但我认为解析项目文件以生成在其他地方使用的文件集是…有点太多要放在构建脚本中。既然你似乎想重用这个,我不认为依赖自定义任务比任何其他形式的重用都更糟糕(即使你可以在现有的nant任务中都这样做,你仍然需要让每个项目以某种方式继承这个过程)。

        2
  •  1
  •   bdukes Jon Skeet    16 年前

    读你的项目文件。我以前做过类似的事情。最后我编写了一个程序,它读取项目文件,并按项目生成文件构建了一个自定义项目。

    然而,我试图编译我的代码库。看起来你只是想把它压缩一下。

    考虑到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 zipfile="myzip.zip">
      <fileset refid="project.source.objects"/>
      <fileset refid="project.misc.sources"/>
    </zip>
    

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

    在我工作过的大多数项目中,我们都为每个项目维护一个构建文件,并使其保持最新。因为我们有一个通用的文件集,这是一个开始,所以我们只需要更新文件中的模糊内容。

    希望有帮助。如果你能提供更多的细节,我也许能提供更多的帮助。

        3
  •  0
  •   Jason Slocomb    16 年前

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

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

    我将使用 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>
    

    希望能有所帮助,

    -杰森