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

Msbuild 在VS发布配置文件中获取解决方案目录,msbuild,visual-studio-2005,publish-profiles,Msbuild,Visual Studio 2005,Publish Profiles,我有一个由来自不同路径的不同项目组成的解决方案。我们使用香草文件夹中的基础项目,然后从特定目录中指定特定项目。例如: specific project directory: c:\proj\specific vanilla project directory: c:\proj\vanilla vanilla project x path: c:\proj\vanilla\repo\src\project\x\code\ 在每个香草项目中,我们都有一个指向根目录的发布配置文件,其中包括一个

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

specific project directory: c:\proj\specific 

vanilla project directory: c:\proj\vanilla

vanilla project x path: c:\proj\vanilla\repo\src\project\x\code\
在每个香草项目中,我们都有一个指向根目录的发布配置文件,其中包括一个publishsettings.targets文件,该文件具有项目应该发布的实际目标。通过使用这种结构,我们可以拥有许多项目,并使用单个目标发布它们,因此我们不需要在所有项目中更改该目标

现在我们发现,在使用这些普通项目时出现了一个问题,因为发布概要文件中使用的路径是相对于普通目录的,实际上我们需要它相对于特定的项目目录(解决方案目录)

在我们的发布配置文件中,我们有:

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

Project="c:\proj\specific\publishsettings.targets" 
通过使用一些msbuild或自定义变量而不是硬编码


我需要它既可以用于香草(因为我有一个香草.sln),也可以用于特定的项目(因为我有一个X.sln)。

下面是一种方法,可以制作您希望看到的
MSBuildSolutionDirectory
的自己版本:

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

$([MSBuild]::GetDirectoryNameOffileOver(`$(MSBuildProjectDirectory)`,`YOUR\u SOLUTION\u NAME.sln`)\
有关MSBuild属性函数的注释:

  • 发件人:
$([MSBuild]::GetDirectoryNameOfFileAbove(目录,文件名)
Looks 在指定目录中,然后逐步在父目录中 目录,直到找到提供的文件或找到根目录 返回该根目录的路径

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

正如我从您的评论中看到的,它在目录中搜索,正如我所说的,特定的sln与vanilla项目不在同一目录路径中,因此它将永远找不到*.sln文件,因为该文件位于c:\proj\specific\specific.sln中,而vanilla项目位于c:\proj\vanilla\n中,因此不确定解决方案是否有帮助。路径是什么o vanilla.sln和X.sln?我想您已经注意到了上面的函数搜索,而不是在项目目录中,它的目的是让您获得解决方案目录(您的问题说您希望使用该目录)。
  <PropertyGroup>
    <SolutionDirectory>$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildProjectDirectory)`, `YOUR_SOLUTION_NAME.sln`))\</SolutionDirectory>
  </PropertyGroup>