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

gro*_*kky 2 .net msbuild

我有这个结构:

\
  MySolution.sln
  Directory.Build.props     (1)
  \src
    Directory.Build.props   (2-src)
    \Project1
    \Project2
  \test
    Directory.Build.props   (2-test)
    \Project1Tests
    \Project2Tests
Run Code Online (Sandbox Code Playgroud)

我具有所有项目的通用属性(1),src项目的通用属性(2-src)和测试项目的通用属性(2-test)。

为了使(2-src)和(2-test)导入(1),根据仓库中的建议,我向其中每个添加了:

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

那是行不通的(我收到一个导入导致循环依赖的错误。)。所以我尝试了:

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

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

<Import Project="../Directory.Build.props" />
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ell 8

为我工作,略有改进:

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

<ImportGroup>
  <Import Project="$(ParentDirectoryBuildPropsPath)" />
</ImportGroup>
Run Code Online (Sandbox Code Playgroud)

当然,要相应地调整条件。


Mar*_*ich 5

您可以使用当前文件的文件夹名称($(MSBuildThisFileDirectory))解决该问题:

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

这是必需的,因为相对路径被解释为相对于项目,因此仅用../作第二个参数将始终是“距csproj一个”,而不管此语句所在文件的位置。