通常在为C#执行构建脚本时,我只需为每个要构建的项目/ dll包含** / * .cs。但是我现在有一种情况,我有一些.cs文件,这些文件不是项目的一部分,而是存在于该目录中(它们可以从另一个库中进行参考)。 .csproj文件中没有链接,因此VS构建工作正常,但是nant构建没有。
有没有人知道是否有一种很简单的方法可以将.cs条目从相关的.csproj文件中拉出来,并将其用作要构建的源文件列表,而不是使用通用的通配符匹配。
提前致谢。
答案 0 :(得分:4)
您不想将msbuild 仅用于C#构建位的任何特殊原因?这就是我为Protocol Buffers端口所做的工作,而且效果很好。它 需要nant-contrib,但这并不是一件困难。
这样你知道你只需要让一件事工作,并且知道它将以同样的方式构建。
您可以查看我的ProtoBuf端口构建文件here,以获取灵感。明显的缺点是Mono支持,但我相信xBuild正在改进......
答案 1 :(得分:3)
nant support使用csproj
任务自动构建VS解决方案,包括<solution>
个文件。
最新支持的解决方案格式是VS 2003。
答案 2 :(得分:3)
Nantcontrib包含msbuild task - 您可以使用它来构建项目和解决方案。以下是实践中的一个示例:http://codebetter.com/blogs/jeffrey.palermo/archive/2006/08/12/148248.aspx
答案 3 :(得分:2)
您可以通过Exec任务使用MSBuild构建项目,而不是直接调用编译器,例如msbuild project.csproj
。
答案 4 :(得分:1)
使用MSBuild是一个好主意。但是,如果有任何孤立文件(.cs文件不在.csproj中),aspnet_compile.exe有时会失败。为了解决这个问题,我编写了以下内容来删除.csproj中未包含的所有* .cs文件。到目前为止一切都很好,任何反馈都表示赞赏。
<project>
<foreach item="File" property="csprojFile">
<in>
<items>
<include name="source/**/*.csproj" />
</items>
</in>
<do>
<property name="currentFolder" value="${directory::get-current-directory()}" />
<property name="csprojParentFolder" value="${directory::get-parent-directory(csprojFile)}" />
<foreach item="File" property="csFile">
<in>
<items>
<include name="${csprojParentFolder}/**/*.cs"/>
</items>
</in>
<do>
<property name="csFileRelativePath" value="${string::replace(csFile, csprojParentFolder + '\', '')}" />
<loadfile property="projFile" file="${csprojFile}" />
<if test="${not string::contains(projFile, csFileRelativePath)}">
<echo message="${csprojFile}: | Missing: ${csFileRelativePath}" />
<!-- <delete file="${csprojParentFolder + '\' + csFileRelativePath}" /> -->
</if>
</do>
</foreach>
</do>
</foreach>
</project>