msbuild Directory.Build.props文件的多级合并

时间:2017-08-31 06:01:10

标签: .net msbuild

我有这个结构:

\
  MySolution.sln
  Directory.Build.props     (1)
  \src
    Directory.Build.props   (2-src)
    \Project1
    \Project2
  \test
    Directory.Build.props   (2-test)
    \Project1Tests
    \Project2Tests

我有所有项目的公共属性(1),src项目的公共属性(2-src),以及测试项目的公共属性(2-test)。

对于(2-src)和(2-test)导入(1),根据advice given at the repo,我添加到每个人:

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props'))" />

这不起作用(我得到一个导致导致循环依赖的错误。)。所以我试过了:

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '../'))" />

出于同样的原因,它也不起作用。但这确实有效:

<Import Project="../Directory.Build.props" />

我更喜欢使用msbuild命令(支持更深层的目录结构),而不是硬编码值。这可能吗?

2 个答案:

答案 0 :(得分:4)

您可以使用当前文件($(MSBuildThisFileDirectory))的文件夹名称来处理它:

  <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))" />

这是必需的,因为相对路径被解释为相对于项目,所以只使用../,因为第二个参数总是#34;一个来自csproj&#34;文件无论此语句所在的文件位置如何。

答案 1 :(得分:0)

为我工作,但有一点改进:

<PropertyGroup>
  <ParentDirectoryBuildPropsPath>$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))</ParentDirectoryBuildPropsPath>
</PropertyGroup>

<ImportGroup>
  <Import Project="$(ParentDirectoryBuildPropsPath)" />
</ImportGroup>

当然,条件。