2

私には小さなプロジェクトがあり、そのプロジェクトの2つのコンパイル済みバージョンが必要です。

  • .NET2.0フレームワークを対象としているもの
  • .NET3.5フレームワークを対象としているもの

すべてが順調に進んでいます。プロジェクトを継続的インテグレーション(CC.NETを使用)し、2つのCC.NET「プロジェクト」を作成しました。ターゲットフレームワークごとに1つのプロジェクト。

(無関係な)詳細についてはあまり詳しく説明しませんが、私のソリューションは、VS.NETの.NET3.5フレームワークをターゲットにするように設定されています。

私は2つのmsbuild-tasksを持っています:

  • .NET 3.5のソリューションを構築する1つのタスク(シンプルで簡単)
  • .NET2.0のソリューションを構築する1つのタスク

    このタスクでは、MSBuildを呼び出し、TargetFrameworkVersionをv2.0にするように指定します。また、いくつかの追加のビルド条件を定義します(.NET3.5固有のコードが.NET2.0を対象とするアセンブリにビルドされないようにするため)。

ここまでは順調ですね。すべてが正常に動作します。しかし今、問題はこれです:

私のソリューションにはいくつかの依存関係があります(サードパーティのアセンブリへの参照)。VS.NETでは、これらの依存関係に対して「ローカルコピー」をtrueに設定しました。CC.NETがアセンブリの.NET3.5バージョンをビルドすると、サードパーティの依存関係が実際に出力ディレクトリにコピーされます。

ただし、CC.NETがアセンブリの.NET2.0バージョンをビルドするとき、依存関係は出力ディレクトリにコピーされません。(その後、これによりユニットテストが失敗します)。

私の質問は次のとおりです。プロジェクトの.NET2.0バージョンをビルドするときに、特定のサードパーティ参照をローカルにコピーする必要があることをmsbuildにどのように伝えることができますか?または、これを実現する他の方法はありますか。ビルドスクリプトですべての依存関係をもう一度指定したくないからです。これはすぐにメンテナンスの悪夢になると思います。

4

3 に答える 3

2

csproj ファイルを手動で変更しなければならないのは好きではないので、この問題をもう一度考えてみました。(参照を変更するときは、csproj ファイルを再度調整して、Private ノードを再度 true に設定することを忘れてはなりません)。

それで、私はMSDNを掘り下げていましたが、これに出くわしました:

ResolveAssemblyReference.TargetFrameworkDirectories プロパティ

解説このプロパティは、結果のアイテムの CopyLocal ステータスを決定するために必要です。

このプロパティが指定されていない場合、ソース アイテムのプライベート メタデータ値が明示的に true でない限り、結果のアイテムの CopyLocal 値は true になりません。

これは、ResolveAssemblyReference タスクの TargetFrameworkDirectories を設定するという別の可能性があることを意味します。しかし、これを行う方法を知っている人はいますか?
いろいろ試しているのですが、どうもうまくいかないようです...

私はこれを試しました:

<ItemGroup>
    <TargetFrameworkDir Include="$(SystemRoot)\Microsoft.NET\Framework\v2.0.50727" />
</ItemGroup>

<PropertyGroup>
   <TargetDirsToUse>@(TargetFrameworkDir)</TargetDirsToUse>
</PropertyGroup>

<ResolveAssemblyReference TargetFrameworkDirectories="$(TargetDirsToUse)" />

しかし、役に立たない... 他の誰かがこれを行う方法を知っているか、黄金のヒントを持っているかもしれません。(私はこのクソ問題に多くの時間を費やしてきました)。

于 2009-06-29T09:51:12.380 に答える
0

1 つの質問: VisualStudio 内で 2.0 ソリューション/プロジェクトをコンパイルしようとするとどうなりますか? サードパーティの参照は自動コピーされますか?

これが 2.0 ではなく 3.5 で機能するのは奇妙です。私自身は並列ビルドを行っていませんが、プロジェクトを 2.0 から 3.5 に変換すると、.NET のバージョンに関係なく、すべてのサード パーティの参照がコピーされました。

ところで: 私はGAC のサードパーティ ライブラリを参照したことはありません(Microsoft のライブラリのみであり、すべてではありません)。私は常にそれらを lib ディレクトリ構造にコピーし、ソース管理に追加して、そこから参照しています。GAC のアセンブリを使用することは、開発マシンのセットアップに不必要に依存することになるため、私の知る限り、悪い習慣です。

このようなディレクトリの例: http://code.google.com/p/projectpilot/source/browse/#svn/trunk/lib

于 2009-07-01T18:39:30.833 に答える