2017-08-31 1 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'は' ../ 'つまり、どちらの場合でも、「ハードコード」と呼ばれます。ファイルが見つかる場所、つまり1つ上位のディレクトリですか? – stijn

+0

@stijn公平な点、私はそれをよく表現していませんでした(そのテキストを更新しました)。しかし、まだmsbuildコマンドを使用すると、ハードコードされた絶対パスを使用するよりも良いように見えます。より深いディレクトリ構造があると仮定します。コマンドを使用すると動作しますが、ハードコードされた値は失敗します。 – grokky

答えて

2

あなたは、現在のファイルのフォルダ名($(MSBuildThisFileDirectory))を使用して、それを回避することができます:相対パスは、これだけ2番目のパラメータとして../を使用して、プロジェクトへの相対パスとして解釈されるため

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

これが必要ですこの文が入っているファイルの場所にかかわらず常に "csproj"ファイルから "up"になります。

+0

2番目の引数は実際にはどういう意味ですか?それは "現在のcsprojディレクトリの上のディレクトリ"と同等ですか?どのようにそれは '../'とは違うのですか?あなたの方法よりももちろん、私のやり方は違います...私は構文を理解していません。 :-) – grokky

+0

答えに説明を追加..相対パスの処理は常にプロジェクトとの相対的なものです –

+0

ありがとうマーティン!!私はそれを試して、それは動作します。 – grokky