4

我正在尝试使用 MSbuild 在我的一个项目上进行命令行构建。解决方案和项目在 VS2012 中构建良好,但是当我执行包含

msbuild.exe project.csproj

它失败。有太多错误,我什至无法滚动过去。对于不同的文件,它们都是相同的错误,都来自解决方案中的其他项目:

CSC : error CS2001: Source file 'folder\filename.cs' cound not be found [c:\folder\project.csproj]

我发现了其他关于文件名长度的问题。我尝试删除路径中的每一层,但无济于事。我觉得奇怪的是源文件路径不是相对的,即使它找不到的文件确实来自其他项目。我在这里有点茫然。为什么我的构建失败?

4

2 回答 2

7

好吧,虽然这实际上可能与其他人看到的问题不同,但我解决了我的具体问题:

有问题的项目是一个 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;
于 2014-01-02T22:57:00.103 回答
1

听起来好像项目是为解决方案创建的,所以当您尝试在解决方案之外构建时,它们会中断,因为解决方案是解决所有项目位置的粘合剂。

如果您从命令行构建解决方案,它是否有效?

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" />

(这应该是出现在 <Project /> 节点之后的第一个 XML 节点)

现在在受影响的 .csproj 文件中找到所有 <ProjectReference /> 节点。修改引用,使路径相对于解决方案根目录并以新的 $(SrcRoot) MsBuild 属性为前缀。

例如从

<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>

现在进行测试以确保您可以通过指定解决方案名称来构建,然后导航到并编译单个项目。

于 2014-01-02T18:38:08.443 回答