我有一个由不同路径的不同项目组成的解决方案。我们使用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)一起工作。
答案 0 :(得分:2)
这是一种制作您希望内置的MSBuildSolutionDirectory
自己版本的方法:
<PropertyGroup>
<SolutionDirectory>$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildProjectDirectory)`, `YOUR_SOLUTION_NAME.sln`))\</SolutionDirectory>
</PropertyGroup>
关于GetDirectoryNameOfFileAbove
MSBuild属性函数的注释:
$([MSBuild]::GetDirectoryNameOfFileAbove(directory, filename)
看起来 在指定的目录中,然后逐步在父目录中 目录,直到找到提供的文件或命中根。然后呢 返回该根的路径。