19

当我使用 Windows CMD 运行Sandcastle Help File Builder 项目文件(例如,myproject.shfbproj)时,我遇到了一个烦人的问题:$(SolutionDir)$(ProjectDir)已经使用的目标$(SolutionDir)

如果我从 Visual Studio 构建整个 Sandcastle 帮助文件生成器,它将成功构建。

我正在使用以下命令(从存储项目的目录执行):

"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /p:Configuration=Development myproject.shfbproj

有解决方法吗?

4

2 回答 2

30

$(SolutionDir)如果您正在构建解决方案(.sln 文件),您只会得到正确的结果。这.shfbproj是一个项目文件,因此没有引用其父解决方案。您可以尝试$(SolutionDir)在命令行中明确指定:

msbuild /p:Configuration=Development /p:SolutionDir=MySolutionDir myproject.shfbproj

供参考:$(SolutionDir) 和 MSBuild

于 2015-09-07T10:46:36.730 回答
13

虽然@m0sa 指出了一个非常明显的事实(因为我正在构建 Sandcastle Help File Builder 项目,所以没有实际的解决方案目录),在构建所谓的文档项目的解决方案时,在 TFS 构建期间也发生了这个问题居住。

现在我已经设法使用一个讨厌的SolutionDir解决方法解决了这个问题:在每个需要作为文档项目的一部分构建的 C# 项目中添加一个属性:

  <PropertyGroup>
    <SolutionDir>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))\</SolutionDir>
  </PropertyGroup>

由于我的解决方案文件将始终位于 Sandcastle Help File Builder 项目目录的父目录中,因此在我的情况下,此解决方法有效...

现在,作为文档源引用的项目能够导入自定义项目,我在其中定义了常见的 MSBuild 属性,无论是在 Visual Studio 构建中还是在外部构建中:

<Import Project="$(SolutionDir)MSBuild\Common.properties" />
于 2015-09-07T10:59:50.893 回答