2013-02-08 26 views
5

解決策につながるいくつかのプロジェクトがあります。すべてのプロジェクトには独自のディレクトリ構造があり、csprojファイルはさまざまなレベルのフォルダ構造に配置されています。 すべてのcsprojにはOutputPathプロパティが指定されています。 OutputPath - 相対パスであり、すべてのプロジェクトが同じ出力ディレクトリを持つように、プロジェクトごとに異なります。 私は別のプロジェクトをビルドしても問題ありません。しかし、ソリューションファイルを作成しようとするとすべてが変わります。この場合、すべてのプロジェクト出力フォルダは異なります(そのプロジェクトのOutputPathの '.. \'の数によって異なります)。MSBuildプロジェクトとソリューションの相対パス

私は知っています、それは少し前にすべてがうまくいきました。誰もbuild.cmdをslnまたはcsprojファイルに変更しませんでした。しかし、今私は上記の状況にあります。

私の質問は - どのように相対パスが評価されるかに影響しますか?私は、特定のプロジェクトのcsprojファイルが置かれているフォルダから相対的なOutputPathが評価されるように強制することができます。 .slnファイルがあるフォルダからではありません。

Let's assume I have following directory structure: 

dir1 
    a.sln 
    dir2 
    a.csproj 
    dir21 
    dir3 
     b.csproj 

a.csprojは b.csprojは../「に設定された出力経路を有するa.csprojフォルダから数えた場合だけDIR1以上である」../../_bin'に設定された出力経路を有します。 ./../_bin 'これは同じです - b.csprojから数えた場合はちょうどdir1

a.slnには - a.csprojとb.csprojの両方が含まれています。

私はmsbuildを実行すると、 'dir1 /../../_ bin'へのプロジェクトビルドを行い、bプロジェクトは 'dir1 /../../../_ bin'へ - プロジェクトファイルの相対パスプロジェクトファイルではなく、ソリューションファイルの場所から数えられます。インポートされたプロジェクトで

答えて

3

これを引き起こしていた原因を特定できました。これはカスタム.targetsファイルで、msbuildの開始時にSolutionDirプロパティを推測していました。 私はMSBuildエクスプローラを使ってそれを見つけました。私の場合、このツールは非常に有用であることが判明しました。私は自分のシステム上の第三者の.targetファイルを認識していませんでした。

+0

+1000同じ根本原因($(OutputPath)を上書き)がありましたが、非常に異なる問題(* .designer.csファイルの再生成が中止されました) - MSBuild Explorerで5分で診断されました。 –

2

Msbuild Import Element descriptionから

相対パスは、インポートプロジェクトの ディレクトリに相対して解釈されます。したがって、プロジェクトファイルが異なる場所にある複数のプロジェクトファイルにインポートされた の場合、インポートされたプロジェクトファイルの 相対パスは、インポートされたプロジェクトごとに異なる と解釈されます。

例えば、プロジェクト・ファイルに関連するすべてのMSBuild予約特性、インポートされたプロジェクトで参照されMSBuildProjectDirectory とMSBuildProjectFileは、インポートプロジェクトファイルに基づい 割り当てられた値です。

質問に詳細やサンプルを追加すると、正確な問題を理解しやすくなります。

編集: さて、その謎を突き止めるようにしましょう。まず第一に、OutputPathは環境変数の影響を受ける可能性があります。

2番目のビルド中に、msbuildプロジェクトファイル形式に変換され、一時ファイルに保存されます。 cmdで "set msbuildemitsolution = 1"を実行し、コマンドラインでビルドを開始すると、その一時ファイルを取得できます。ここでそのファイルを確認し、個々のプロジェクトがどのように呼び出されたかを確認できます。しかし、複数の.csproj />エントリが表示されると思います。その呼び出しによって継承されたグローバルmsbuildプロパティ。

私は、何らかの点が前にすべてうまくいき、変更が加えられていないと思われます。OutputPath環境変数やOutputPathの構築に貢献した他の変数がありません。

BTW - 強制的な相対ディレクトリで問題を解決したい場合は、$(MSBuildProjectDirectory)を使用することもできます。これはmsbuildの予約済みプロパティ(here)ですが、これは各csprojファイルでOutputPathを調整する必要があります。他のいくつかのターゲットに影響を与え、微妙な問題を引き起こす可能性があるため、個人的には避けたいものです。

+0

インポートされたプロジェクトが何を意味するのかよく分かりませんが、私の場合、すべての相対パスはソリューションファイルのディレクトリを基準に解釈されます。そして、私はそれをどのように変更するかわかりません... – DarkDeny

+0

あなたの助けてくれてありがとうが、私は問題を修正し、上記の自分自身の答えで述べた。とにかく参加してくれてありがとう! – DarkDeny