题
通常,在为C#进行构建脚本时,只需包含**/*CS即可为每个项目/DLL构建。但是,我现在有一个情况,我有一些.cs文件,这些文件不是该项目的一部分,而是居住在该目录中(它们是从另一个库中出于参考目的)。 .csproj文件中没有链接,因此VS构建工作正常,但Nant构建却没有。
有人知道是否有一种很好的简便方法可以将.CS条目从相关的.csproj文件中拉出,并将其用作要构建的源文件列表,而不是使用一般通配符匹配。
提前致谢。
解决方案
您不想使用msbuild的任何特定原因 仅适用于C#构建位?这就是我为协议缓冲区端口所做的,它运行良好。它 做 要求 南特·科特里布(Nant-Contrib), ,但这没什么大不了的。
这样,您知道您只需要让一件事情正常工作,并且知道它将以相同的方式构建。
您可以查看我的Protobuf端口构建文件 这里, ,为了灵感。显而易见的缺点是单声道支持,但我相信Xbuild正在改善...
其他提示
南特有 支持 用于自动构建解决方案,包括 csproj
文件,使用一个 <solution>
任务。
最新支持的解决方案格式是VS 2003。
NantContrib 包括一个 MSBUILD任务 - 您可以使用它来构建项目和解决方案。这是实践中的一个例子: http://web.archive.org/web/20100913051600/http://codebetter.com/blogs/jeffrey.palermo.palermo/archive/2006/08/12/12/148248.aspx
您可以通过执行任务使用MSBUILD构建项目,而不是直接调用编译器 msbuild project.csproj
.
使用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>