【问题标题】:How to "get rid of" $(SolutionDir) when building Visual Studio project from outside Visual Studio从 Visual Studio 外部构建 Visual Studio 项目时如何“摆脱”$(SolutionDir)
【发布时间】:2013-02-09 19:49:34
【问题描述】:

我想从 Visual Studio 外部通过 MSBuild 构建一个 .vcxproj。问题是 .vcxproj 文件中有很多 $(SolutionDir) 出现,显然只有在加载解决方案时才能正确设置。

当我用实际的绝对路径替换 $(SolutionDir) 时,它可以工作。但是其他机器上的其他人正在使用相同的项目文件,所以这不是一个解决方案。

有解决这个问题的方法或技巧吗?

【问题讨论】:

    标签: visual-studio-2010 msbuild


    【解决方案1】:

    您可以通过传递参数参数来设置变量:

    /p:SolutionDir=path
    

    因此,您可以创建一个构建脚本来设置环境并相应地执行 MSBuild,而不是编辑解决方案文件,而将 Visual Studio 文件保留用于开发工作。

    【讨论】:

    【解决方案2】:

    您可以使用相对路径。

    我不确定问题中的 Visual Studio 2010,但它保证自 Visual Studio 2012 起就可以工作。

    如果项目文件夹位于解决方案文件夹下,则相对路径为..\\

    顺便说一句,这可以与来自Grant Thomas's answer 的参数自变量结合使用。

    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
    

    【讨论】:

    • 例如,在覆盖 .targets 时,遍历目录在 TFS 签入构建中不起作用。需要绝对路径。
    • 请说明这应该放在相关*.csproj 文件的&lt;PropertyGroup&gt; 元素中。我觉得这是您的回答中缺少的重要信息。
    【解决方案3】:

    SolutionDir 作为参数显式传递的解决方案对我来说是不够的。

    也就是说,如果我要构建的项目具有不同构建配置的依赖项,则构建失败并出现This project doesn't contain the Configuration and Platform combination of &lt;my target configuration&gt; 错误。

    这是有道理的,因为我没有为依赖项指定目标配置,因此它尝试将目标配置为与我正在构建的项目相同的配置,而他们没有(在我的情况下)。

    由于解决方案文件包含解决方案中所有项目的构建配置(给定一些解决方案配置),我们希望利用此解决方案来解决此问题。幸运的是,MSBuild 允许我们构建一个解决方案并将一个特定的目标项目作为参数传递,这只会导致该项目被构建(连同它的依赖项)。

    msbuild MySolution.sln /t:MyProject
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多