2017-01-25 23 views
1

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

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文件中的每个项目的香草。通过使用这种结构,我们可以制作大量项目并使用单个目标发布它们,因此我们无需在所有项目中更改该目标。

我们现在发现使用这些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”变量,可以使用。

有谁知道一种方法,我可以通过使用一些的MSBuild或自定义变量,而不是硬编码获取路径

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

实际上是

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

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

回答

1

这是一种方法,使自己的MSBuildSolutionDirectory你希望的版本,看看建于:

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

注意在GetDirectoryNameOfFileAbove的MSBuild属性函数:

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

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

我可以从您的评论看,它搜索的目录和我说具体SLN不与香草项目相同的目录路径所以它永远不会发现由于* .sln文件该文件位于c:\ proj \ specific \ specific.sln中,而vanilla项目位于c:\ proj \ vanilla \中,因此不确定该解决方案是否有帮助。 –

+0

vanilla.sln和X.sln的路径是什么?我假设你注意到上面的功能搜索,而不是内部的项目目录,并且旨在让你得到解决方案目录(你的问题说你希望使用)。 – weir

相关问题