Visual Studioソリューション間で外部依存関係を共有するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1217005

質問

Javaのバックグラウンドがあるので、依存関係をダウンロードして依存関係を最新に保つことに関するすべての問題をMavenで処理することに慣れていました。しかし、.NET環境では、これらすべての外部依存関係を管理する良い方法をまだ見つけていません。

ここでの主な問題は、私がソリューションを大量生産することであり、それらはすべて同じサードパーティdll <!>#8217; sに依存する傾向があることです。しかし、私は<!>#8217; t各ソリューションの下で各コンポーネントの別々のコピーを維持したくない。したがって、すべての異なるソリューションを同じdll <!>#8217; sのセットにリンクする方法が必要です。

1つの解決策は、外部ライブラリを<!>#8221; library project <!>#8221に含めることであることに気付きました。これはすべてのソリューションに含まれており、他のプロジェクトがそれらを参照できるようにします。 (または、すべてのプロジェクトで同じ場所から外部dll <!>#8217; sを参照するようにしてください。)

しかし、これを行うより良い方法はありますか? (できれば、Visual Studio用の何らかのプラグインを使用してください。)

I <!>#8217; Visual Studio Dependency Manager を見たところ、完璧なようです一致しますが、誰かが実際にそれを試しましたか? I <!>#8217; Mavenの.NETポートも見ましたが、残念ながらそれらのステータスにあまり感心していませんでした。 (ただし、もう一度試してみるべきだと思う場合は、先に進んで、誰にも勧めてください。)

では、この問題に取り組む最も賢い方法は何ですか?

更新:

同じdllのセットへのリンク#8217; s の意味を説明する必要があることに気付きました。

ここで達成しようとしていることの1つは、異なるソリューションが各コンポーネントの異なるバージョンを参照していることを回避することです。コンポーネントを新しいバージョンに更新する場合、次のビルド時にすべてのソリューションに対して更新する必要があります。これにより、すべてのソリューションが最新のコンポーネントで最新であることを確認しなければなりません。

更新2: これは、 NuGet OpenWrap が存在していました。誰でも最新の情報を提供してくれる場合は、先に進んでください。受け入れられた回答を変更します。

役に立ちましたか?

解決

  1. アセンブリを保存する場所を見つけます。たとえば、次のように.Netコアアセンブリを保存します。

    • <branch <!> gt; \ NetFX \ 2.0527 \ *
    • <=> <!> gt; \ NetFX \ 3.0 <=> *
    • <=> <!> gt; \ NetFX \ 3.5 <=> *
    • <=> <!> gt; \ NetFX \ Silverlight 2 <=> *
    • <=> <!> gt; \ NetFX \ Silverlight 3 <=> *
  2. MSBuildのReferencePathプロパティ(またはチームビルドのAdditionalReferencePath)を使用して、プロジェクトが適切なパスを指すようにします。単純化と簡単なメンテナンスのために、このようなすべてのディレクトリについて知っている1つの* .targetsファイルがあります。すべてのプロジェクトそのファイルをインポートします。

  3. バージョン管理戦略(ブランチ、マージ、ローカル<!> lt;-<!> gt;サーバーマッピング)がプロジェクト間の相対パスを維持していることを確認してください<!> amp;参照パス定数。

編集

質問の更新に応じて、もう1ステップ追加します。

4)すべてのプロジェクトファイルのすべてのアセンブリ参照が、完全な.Net厳密名のみを使用していることを確認します

悪い:

<Reference Include="Microsoft.SqlServer.Smo">
  <SpecificVersion`>False</SpecificVersion>
  <HintPath>..\..\..\..\..\..\..\Program Files (x86)\Microsoft SQL Server\100\Shared\Microsoft.SqlServer.Smo.dll</HintPath>
</Reference>

良い:

<Reference Include="Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />

後者の形式の利点:

  • 共同開発環境でHintPathを使用すると、必然的に<!> quot; me for works <!> quot;という状況になります。他の人ではありません。特にビルドサーバー。省略すると、参照パスを正しく取得する必要があります。そうしないと、コンパイルされません。
  • 弱い名前を使用すると、<!> quot; DLL hell。<!> quot;が発生する可能性があります。厳密な名前を使用すると、参照パスに同じアセンブリの複数のバージョンを含めることが安全です。これは、リンカーがすべての基準に一致するもののみをロードするためです。さらに、(コピーを追加するのではなく)いくつかのアセンブリを更新することにした場合、バグが発生し始めるたびにではなく、コンパイル時に重大な変更が通知されます。

他のヒント

他の皆が言っていることに加えて、それは基本的に2つのことになる:

  1. すべての開発者が同じバージョンの外部ライブラリを持っていることを確認する
  2. すべての開発者が外部ライブラリを同じ場所に(少なくとも、ソースコードに対して)配置していることを確認する

Richard Bergが指摘しているように、ReferencePathおよび/またはAdditionalReferencePathを使用して、#2の解決に役立てることができます。ビルドプロセスでmsbuildを使用している場合(この場合、MS Team Buildの代わりにCruiseControlを使用しています)、コマンドラインでReferencePathを渡すこともできます。 #1を解決するために、 svn:externals が便利です(SVNを使用している場合)。

Mavenでの私の経験では、ほとんどの目的にとってはやり過ぎです。

通常、外部依存関係または内部依存関係のソース管理に個別のフォルダー構造があり、これらのfilderには、たとえばビルドまたはバージョン番号に応じたアセンブリがあります

public \ External \ libraries \ Nunit \ 2.6 \

または

Public \ Internal \ libraries \ Logger \ 5.4.312 \

およびソリューション内で、依存関係のいずれかを使用する必要があるすべてのプロジェクトは、パブリック内部フォルダーまたは外部フォルダーにそのアセンブリへの参照を追加するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top