2017-08-31 21 views
1

我有这样的结构:多级合并文件

\ 
    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测试)。

对于(2-SRC)和(2测试)导入(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命令(支持更深的目录结构),而不是硬编码的值。那可能吗?

+0

*,而不是硬编码*,但不是写'GetPathOfFileAbove'基本相同,写''../,即在两种情况下,你都说'硬编码' - 文件必须找到,即一个目录高一些? – stijn

+0

@stijn公平点,我没有表达得很好(更新了文本)。但仍然使用msbuild命令似乎比使用硬编码绝对路径更好。假设有一个更深的目录结构 - 使用这些命令可以工作,但是我的硬编码值会失败。 – grokky

回答

2

你可以解决它通过使用当前文件的文件夹名称($(MSBuildThisFileDirectory)):

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

这是必需的,因为相对路径被解释为相对于这样只是用../作为第二个参数项目将始终是“一起来从的csproj”文件不管文件这种说法是在的位置。

+0

第二个参数究竟意味着什么?它相当于“目前csproj目录上的目录”吗?如何是不同的,以''../ - 其他课程的比你的工作方式和我的方式不......我不明白的语法。 :-) – grokky

+0

增加了一个解释答案..处理相对路径总是相对于项目 –

+0

感谢马丁!我试了一下,它的工作原理。 – grokky