我正在尝试使用MSbuild在我的一个项目上构建命令行。解决方案和项目在VS2012中构建良好,但是当我执行包含
的批处理文件时msbuild.exe project.csproj
失败了。有很多错误我甚至无法向上滚过它们。对于不同的文件,它们都是相同的错误,所有这些都来自解决方案中的其他项目:
CSC : error CS2001: Source file 'folder\filename.cs' cound not be found [c:\folder\project.csproj]
我发现了其他有关文件名长度的问题。我尝试删除路径中的每一层,但无济于事。我发现奇怪的是源文件路径不是相对的,即使它找不到的文件确实来自其他项目。我在这里有点不知所措。为什么我的构建失败了?
答案 0 :(得分:6)
好吧,虽然这可能不是其他人看到的同样问题,但我解决了我的具体问题:
有问题的项目是一个MVC 4项目。 MVC有一个选项,您可以在项目文件中启用该选项,在编译过程中构建剃刀视图,表面上是这样您可以捕获构建时通常会出现的运行时错误。
这个功能并没有得到特别好的支持,当你从命令行构建时,它开始在奇怪的地方寻找东西,因为它正在进行这些中间构建。视图在临时目录中构建,然后它尝试从项目目录中复制它,然后一切都崩溃了。
此外,我们需要知道一些后期构建事件的解决方案目录,但这对大多数人来说都是无关紧要的。我们还构建了一个包,然后直接部署,以便更容易地将东西复制到它需要去的各个地方。对于更复杂的项目,构建为一个包也可以正确解析项目可能具有的所有解决方案引用。为了完成起见,我把它包括在这里。
以下是让一切正常运行的行:
msbuild.exe /v:q projectName.csproj /t:Package /p:MvcBuildViews=false;SolutionDir=%SolutionDir%;DeployOnBuild=true
以及真正解决问题的简单版本:
msbuild.exe projectName.csproj /p:MvcBuildViews=false;
答案 1 :(得分:0)
听起来好像项目是为解决方案创建的,所以当你尝试在解决方案之外构建时,它们会破解,因为解决方案是解决所有项目位置的粘合剂。
如果从命令行构建解决方案,它是否有效?
msbuild.exe solutionname.sln
如果是这样,请关闭Visual Studio,打开Notepad ++并准备开始编辑一些XML!
消除绝对路径的使用,优先选择相对于解决方案根文件夹的路径。
首先,在您的登记根目录中创建一个名为“Common.props”的公共属性文件夹,并添加以下标记:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<SlnRoot>$( [MSBuild]::GetDirectoryNameOfFileAbove( $(MSBuildThisFileDirectory), Common.props ) )</SlnRoot>
</PropertyGroup>
</Project>
然后,将此标记添加到每个成员项目文件中。
<PropertyGroup>
<CommonPropsFolder>$([MSBuild]::GetDirectoryNameOfFileAbove( $(MSBuildProjectDirectory) ,Common.props))</CommonPropsFolder>
</PropertyGroup>
<Import Project="$(CommonPropsFolder)\Common.props" />
(这应该是&lt; Project /&gt;节点后面出现的第一个XML节点)
现在找到所有&lt; ProjectReference /&gt;受影响的.csproj文件中的节点。修改引用,使路径相对于解决方案根目录,并以新的$(SrcRoot)MsBuild属性为前缀。
e.g。 来自
<ProjectReference Include="..\..\Tools\Build\Common.csproj">
<Project>{deadbeef-dead-beef-dead-beefdeadbeef}</Project>
<Name>Common</Name>
</ProjectReference>
要
<ProjectReference Include="$(SlnRoot)\Tools\Build\Common.csproj">
<Project>{deadbeef-dead-beef-dead-beefdeadbeef}</Project>
<Name>Common</Name>
</ProjectReference>
现在测试以确保您可以通过指定解决方案名称来构建,然后导航到并编译单个项目。