2

我有一个由来自不同路径的不同项目组成的解决方案。我们使用 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 发布时,它会发布到特定的项目,而不是普通项目。

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

有谁知道我可以找到路径的方法

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

实际上是

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

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

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

4

1 回答 1

2

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

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

GetDirectoryNameOfFileAboveMSBuild 属性函数注意事项:

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

  • 根据我自己的测试:
    • 返回的路径不包含尾部反斜杠。
    • 如果找不到文件名,则返回一个空字符串。
于 2017-01-26T17:39:00.970 回答