5

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

私は、ある瞬間まではすべてがうまく機能していたことを知っています。誰も 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 の出力パスは「../../_bin」に設定されています。これは、a.csproj フォルダーから数えた場合、dir1 のすぐ上にあります。b.csproj の出力パスは「../../../_bin」に設定されています。同じです-b.csprojから数えた場合、dir1について

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

msbuild を実行すると、「dir1/../../_bin」へのプロジェクト ビルドと「dir1/../../../_bin」への b プロジェクトが取得されます。プロジェクト ファイルの両方の相対パスがソリューションからカウントされます。プロジェクト ファイルではなく、ファイルの場所。

4

2 に答える 2

3

さて、これで何が原因なのかを突き止めることができました。これはカスタム .targets ファイルで、msbuild の開始時に SolutionDir プロパティを推測していました。MSBuild Explorer を使用して確認しました。私の場合、このツールは非常に便利であることがわかりました。システムにサードパーティの .target ファイルがあることを知りませんでした。

于 2013-02-11T14:07:51.897 に答える
2

Msbuildインポート要素の説明から

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

インポートされたプロジェクトで参照される MSBuildProjectDirectory や MSBuildProjectFile など、プロジェクト ファイルに関連するすべての MSBuild 予約済みプロパティには、インポートするプロジェクト ファイルに基づいて値が割り当てられます。

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

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

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

したがって、ある時点より前にすべてが正常で、変更が行われていない場合は、OutputPath 環境変数または OutputPath の構築に貢献したその他の変数が欠落している可能性があります。

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

于 2013-02-10T11:49:44.997 に答える