Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在NAnt中,我可以创建VS项目中列出的文件集吗?_.net_Build Process_Build Automation_Nant_Nantcontrib - Fatal编程技术网

.net 在NAnt中,我可以创建VS项目中列出的文件集吗?

.net 在NAnt中,我可以创建VS项目中列出的文件集吗?,.net,build-process,build-automation,nant,nantcontrib,.net,Build Process,Build Automation,Nant,Nantcontrib,我正在重写我们的构建脚本,以使它们更干净、更简单,以及更通用 构建过程中的一个步骤是将某些文件打包成zip文件。在我们创建包含大量文件类型的应用程序之前,我们试图捕获项目中可能包含的所有内容。当我们希望在项目中包含非标准文件类型时,这有时会导致问题 我希望能够找到一种方法,根据VisualStudio项目文件(.csproj)中列出的文件(以及文件的子集)创建一个。然后,我可以在任务中使用此文件集。我还没有发现任何能够自动完成这项任务的东西(尽管中现在不推荐的任务看起来有点前途) 我开始尝试手动

我正在重写我们的构建脚本,以使它们更干净、更简单,以及更通用

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

我希望能够找到一种方法,根据VisualStudio项目文件(.csproj)中列出的文件(以及文件的子集)创建一个。然后,我可以在任务中使用此文件集。我还没有发现任何能够自动完成这项任务的东西(尽管中现在不推荐的任务看起来有点前途)

我开始尝试手动执行此操作,但遇到了阻碍。我有一个从解决方案获取项目的目标(使用),然后尝试使用获取项目中的每个内容文件(使用XPath查询
/n:project/n:ItemGroup/n:Content/@Include
)。这里的问题是,它不会返回所有值,只返回第一个值。而且,即使它确实返回了所有值,我也不确定如何从这里将其转换为一个值

有没有办法挽救这种思维方式?我能用自定义NAnt任务完成我想要的吗(我不希望每个项目都依赖于自定义任务)?有没有我找不到的内在方法来实现这一点

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

谢谢


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

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


但我认为解析项目文件以生成在其他地方使用的文件集是。。。要在构建脚本中添加更多内容。而且,既然您似乎希望重用这个过程,我不认为依赖自定义任务比任何其他形式的重用更糟糕(即使您可以在现有的Nant任务中完成这一切,您仍然需要让每个项目以某种方式继承该过程)。

至于读取项目文件。我以前做过类似的事情。最后,我只编写了一个程序,读取项目文件并逐个项目构建文件构建自定义项目

然而,我试图编译我的代码库。看起来你只是想把拉链拉上

考虑到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(它得到它的代码隐藏文件,它是这样做的)

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


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

我喜欢Josh想法的第一部分

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

与NAnt的zip任务不同,我将使用在上一步中生成的列表创建存档:

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


希望有帮助


-jason

使用命名文件集将不变的通用内容保存在一个位置是个好主意。另一个问题中的代码示例应该有助于构建此自定义任务。否则,我肯定会走正则表达式和XML解析的道路。
<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>