在VS发布配置文件中获取解决方案目录

时间:2017-01-25 10:28:37

标签: msbuild visual-studio-2005 publish-profiles

我有一个由不同路径的不同项目组成的解决方案。我们使用vanilla文件夹中的基础项目,然后从特定目录中项目特定项目。例如:

specific project directory: c:\proj\specific 

vanilla project directory: c:\proj\vanilla

vanilla project x path: c:\proj\vanilla\repo\src\project\x\code\

在每个vanilla项目中,我们都有一个发布配置文件,该配置文件指向根目录,并包含一个publishsettings.targets文件,该文件具有应该发布项目的实际目标。通过使用这种结构,我们可以拥有大量项目并使用单个目标发布它们,因此我们不需要在所有项目中更改该目标。

我们现在发现使用这些vanilla项目时遇到问题,因为发布配置文件中使用的路径与vanilla目录相关,实际上我们需要它相对于特定的项目目录(解决方案目录)。

在我们的发布资料中,我们有:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="..\..\..\..\..\..\publishsettings.targets" />
  <PropertyGroup>
  ...
  </PropertyGroup>
</Project>

所以我们需要一种方法来指定这个路径的实际sln目录,这样我们就可以包含正确的目标,所以当我们从visual studio进行发布时,它将发布到特定的项目而不是vanilla。

我尝试找到“MSBuildSolutionDirectory”,但它似乎只是一个可以使用的“MSBuildProjectDirectory”变量。

有谁知道我可以获得路径的方式

Project="c:\proj\vanilla\publishsettings.targets"  

实际上是

Project="c:\proj\specific\publishsettings.targets" 

使用一些msbuild或自定义变量而不是硬编码?

我需要它与vanilla(因为我有一个vanilla.sln)以及特定项目(因为我有一个X.sln)一起工作。

1 个答案:

答案 0 :(得分:2)

这是一种制作您希望内置的MSBuildSolutionDirectory自己版本的方法:

  <PropertyGroup>
    <SolutionDirectory>$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildProjectDirectory)`, `YOUR_SOLUTION_NAME.sln`))\</SolutionDirectory>
  </PropertyGroup>

关于GetDirectoryNameOfFileAbove MSBuild属性函数的注释:

  

$([MSBuild]::GetDirectoryNameOfFileAbove(directory, filename)看起来   在指定的目录中,然后逐步在父目录中   目录,直到找到提供的文件或命中根。然后呢   返回该根的路径。

  • 从我自己的测试:
    • 返回的路径不包含尾部反斜杠。
    • 如果找不到文件名,则返回空字符串。