9

私は msbuild と msbuildtasks を初めて使用します。

インポートするターゲット ファイルへの相対ファイル パスを表すプロパティを設定するにはどうすればよいですか? すべての開発マシンで動作するように、相対参照が必要です。しかし、インポートのターゲットは内部で相対ファイル パスを使用しようとしています。これは、インポートされたターゲットに対して再評価されるため機能しません!

事実上、インポートされたプロジェクトの文書化された動作を回避しようとしています:

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

4

6 に答える 6

15

Is it possible to use MSBuild Extension Pack without installation? にも同様の質問がありました。. その質問は、MSBuild Extension Packで同じことを行う方法でした。この点ではどちらも似ています。Extension Pack の場合、プロパティExtensionTasksPathを宣言する必要があり、コミュニティ タスクの場合、MSBuildCommunityTasksLibという名前の同様のプロパティを宣言する必要があります。したがって、あなたの場合は次のようになります。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MSBuildCommunityTasksLib Condition="'$(MSBuildCommunityTasksLib)' == ''">E:\Data\Development\My Code\Community\MSBuild\CommunityTasks\</MSBuildCommunityTasksLib>
  </PropertyGroup>

  <Import Project="$(MSBuildCommunityTasksLib)MSBuild.Community.Tasks.Targets"/>

  <Target Name="Demo">
    <!-- Use the tasks here -->
  </Target>

</Project>
于 2010-01-22T15:44:22.803 に答える
5

わかりました、答えを見つけました。基本的に、プロパティMSBuildCommunityTasksPathを、元の含まれているディレクトリへの相対パスとして設定する必要があります。

たとえば、次のようなフォルダ構造があるとします。

ルート---プロジェクト---ビルド---{私のmsbuildプロジェクト}
           |
           |-ツール---MSBuildCommunityTasks---{バイナリとターゲット}
ここで、
{私のmsbuildプロジェクト}はRoot \ Project \Build\
にあります{MSbuildCommunityTasks}はRoot\Project \ Tools\MsBuildCommunityTasksにあります

ターゲットプロジェクトがプロパティMSBuildCommunityTasksPathを介してそのバイナリを参照するようにするには、次のようなタスクファイルが見つかります。

<PropertyGroup>
    <MSBuildCommunityTasksPath>..\MSBuildCommunityTasks\</MSBuildCommunityTasksPath> <!--Relative path back to yourself-->
</PropertyGroup>

次に、別の相対ファイル参照を使用してターゲットファイルをインポートできます。

  <Import Project="..\..\Tools\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets"/>
于 2010-01-22T17:17:15.423 に答える
5

@サイード・イブラヒム・ハシミ

MSBuild4 について話す MSBuildCommunityTasksLib を宣言するだけでは十分ではありません。MSBuild.Community.Tasks.Targets ファイルをチェックすると、プロパティは次のように宣言されます。

<PropertyGroup>
    <MSBuildCommunityTasksPath Condition="'$(MSBuildCommunityTasksPath)' == ''">$(MSBuildExtensionsPath)\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
    <MSBuildCommunityTasksLib>$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll</MSBuildCommunityTasksLib>
  </PropertyGroup>

したがって、U が MSBuildCommunityTasksLib のみをオーバーライドすると、条件付きではないため、MSBuild.Community.Tasks.Targets ファイルで再度オーバーライドされます。そのため、MSBuildCommunityTasksPath もオーバーライドして、プロパティが MSBuildExtensionsPath からではなくカスタム パスから設定されるようにする必要があります。 . 私が間違っていたら訂正してください

于 2011-10-11T14:12:36.127 に答える
0

正直なところ、私はmsbuildの初心者ですが、これで発生した自分の問題を解決したばかりです。ターゲットの1つを独自のプロジェクトに変えていましたが、msbuildコミュニティパスのパスが見つかりませんでした。元のプロジェクトを見ると、次のようなものが見つかるかもしれません。

<PropertyGroup>
    <ExtensionTasksPath>./</ExtensionTasksPath>
    <MSBuildCommunityTasksPath>./</MSBuildCommunityTasksPath>
</PropertyGroup>

<Import Project="MSBuildExtensionPack\MSBuild.ExtensionPack.tasks"/>
<Import Project="MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

このコードを新しいプロジェクトにコピーすると、機能するはずです。

于 2012-01-17T14:28:07.513 に答える
0

コメント(担当者)できないため、特定のプロジェクトへのパスを実行するには、次のようにプロパティグループで $(SolutionDir) を使用できることを追加したかっただけです。

$(SolutionDir)\My Code\Community\MSBuild\CommunityTasks\

この方法では、特定のドライブに縛られず、ソリューション ディレクトリ構造に関連するプロジェクトの場所に基づくことができます。

また、上記の回答に感謝します。上記の追加により、私のプロジェクトで役立ちました。

于 2014-07-16T17:50:30.093 に答える
0

これは1つの答えのようです:

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/feb782e3-72ae-4476-9011-617796f217b6

しかし、これは(私が正しく理解していれば)ばかげた解決策のようです。パスを機能させるには、インポートされたプロジェクト参照を変更する必要がありますか? 別のフォルダーにある 3 番目のプロジェクトからインポートしたプロジェクトを参照したい場合はどうなりますか?!?

于 2010-01-22T17:00:08.093 に答える