如何在从Visual Studio外部构建项目时“摆脱”$(SolutionDir)。

23
我想通过MSBuild在Visual Studio之外构建.vcxproj文件。问题是,.vcxproj文件中有许多$(SolutionDir)的出现,这些似乎只有在加载解决方案时才能正确设置。
当我用实际的绝对路径替换$(SolutionDir)时,它可以工作。但其他人在其他机器上使用同一个项目文件,所以这不是一个解决方案。
是否有解决此问题的解决方案或技巧?
3个回答

34
你可以通过传递参数来设置变量:
/p:SolutionDir=path

因此,与其编辑解决方案文件,您可以创建一个构建脚本来设置环境并相应地执行MSBuild,使Visual Studio文件保持不变以进行开发工作。

1
这是2013年的一个好答案,但是NuGet后来转向了nuget restore命令https://learn.microsoft.com/en-us/nuget/consume-packages/package-restore,因此不应再使用这样的技巧。 - Lex Li

9
你可以使用相对路径。
我不确定在问题中提到的Visual Studio 2010是否支持,但自Visual Studio 2012以来,它已保证可用。
如果项目文件夹就在解决方案文件夹下面,则相对路径为..\\
顺便提一下,这可以与Grant Thomas所提供答案的参数参数结合使用。
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>

当覆盖 .targets 文件时,在 TFS checkin 构建中向上遍历目录无法正常工作。需要使用绝对路径。 - Shiv
1
请说明这应该放在相关的 *.csproj 文件的 <PropertyGroup> 元素中。我认为这是你回答中缺失的重要信息。 - Chris Hatton

8
SolutionDir作为参数显式传递的解决方案对我来说不够充分。也就是说,如果我想要构建的项目具有不同构建配置的依赖项,则构建将失败,并出现This project doesn't contain the Configuration and Platform combination of <my target configuration>错误。这是有道理的,因为我没有为依赖项指定目标配置,因此它尝试以与我正在构建的项目相同的配置为目标,而它们没有(在我的情况下)。由于解决方案文件包含给定某些解决方案配置中所有项目的构建配置,因此我们希望利用此解决方案来解决此问题。幸运的是,MSBuild允许我们构建解决方案并将特定目标项目作为参数传递,这将只导致该项目(以及其依赖项)被构建。
msbuild MySolution.sln /t:MyProject

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接