68

チーム間でコードを共有できるように、内部開発に Nuget を使用しています。ただし、複数の nuget パッケージに同時にデプロイされるコードを 1 人が作業している場合、問題が発生します。例えば

A は C に依存する B に依存します。

A、B、および C のアーティファクトは Nuget にプッシュされ、それが A、B、および C 間の依存関係を管理する方法です。次のプロセスを経る必要があります。

  1. Cに変更を加えます。
  2. 変更を git にプッシュする
  3. CI は C への変更をピックアップし、新しい nuget パッケージをビルドしてデプロイします。
  4. B に移動し、nuget update package コマンドを使用して C への参照を更新します。
  5. packages.config ファイルへの変更を git にプッシュアップします。
  6. CI は B への変更を取得し、B の新しい nuget パッケージをビルドしてデプロイします
  7. Aを開き、Bへの参照を変更し、パッケージを更新します
  8. A に変更を加えて、B の変更に合わせます (および推移的に C)

これは非常に苦痛であり、一部の開発者は、社内で開発したコードに Nuget を選択したことに疑問を呈しています。外部パッケージを使用するために、誰もが今でも気に入っています。

内部で Nuget を使用するためのより良いワークフローはありますか?

4

4 に答える 4

7

ここには 2 つの選択肢があります。

  1. 組織内でNuGet ギャラリーのインスタンスを実行します。これはnuget.orgを実行するコードです
  2. Nuget サポートが組み込まれており、Nuget リポジトリとして機能するArtifactory Proのライセンスを取得します。

私は両方を使用しましたが、最初は #1 を選択するのが合理的ですが、NuGet ギャレーは、オンプレミス/エンタープライズでの使用ではなく、nuget.org 向けに最適化および設計されているため、パッケージの削除などは面倒です (手巻きの SQL が必要です)。 )。

Artifactory Pro の (低い) ライセンス料を支払うべきだと思います。これは優れた製品であり、JFrog チームは非常に熱心で、熱心です。

内部/エンタープライズ パッケージには nuget.org を使用しないでください。nuget.org は、内部ビルドの依存関係ではなく、サード パーティ/オープン ソース ライブラリ用に設計されています。

編集:ワークフローに関して、共有コードを複数のパッケージに入れるのはなぜですか? コードを共有する必要がある場合は、独自の別のパッケージに入れる必要があります。

編集 2 : 開発者のコ​​ード変更ワークフローを高速化するには、nuget.exe(コマンドライン クライアント) を使用してコマンドラインからアクセス可能なビルドを使用できるため、「開発者」ビルドの実行をターゲットにできます。次に、(CI ビルドではなく) "開発者" ビルドでnuget install B -Source C:\Code\B、新しく更新さBれたものを依存関係としてプルし、それに対してビルドする場合は、-Source をローカル パス (例: ) として指定します。Cまたは他のローカルの新しく更新されたパッケージについても同様です。次に、AB、およびCすべてが正常にビルドされたらgit push、それらすべてを (逆の依存関係の順序で) CI に任せることができます。

ただし、このビルド「ダンス」を頻繁に行う必要がある場合は、パッケージの分離が本当に適切かどうかについても質問する必要があります。これは、すべてのコードを単一のパッケージにするか、別のパッケージの異なる行に沿って分割する必要があることを示唆しているためです。適切に定義されたパッケージの重要な機能は、セマンティック バージョニングを効果的に使用している場合はもちろん、他のパッケージに波及効果を引き起こさないことです。

編集 3 marcelo-oliveira によって要求されたいくつかの明確化: 「コマンド ラインでアクセス可能なビルド」は、通常はバッチ ファイルを介して、Visual Studio を使用せずにコマンド ラインから完全に実行できるビルドです。「開発者ビルド」は、CI サーバー上で実行される CI ビルドとは対照的に、開発者が自分のワークステーションから実行するビルドです (どちらのビルドも本質的に同じである必要があります)。

于 2013-08-11T13:09:33.737 に答える
2

A、B、および C が同じソリューションの下にある場合、単一のビルドでそれらの NuGet パッケージを作成できます。

使用しているパッケージに、依存するパッケージの新しいバージョン番号があることを確認してください (ビルドによってランダムに変更されないと仮定します)。

A、B、および C が意図的に異なるソリューションの下にある場合 (たとえば、A がインフラストラクチャ ソリューションの下にあり、B が製品ソリューションの下にある場合)、唯一の提案は、定期的ではなくチェックイン時に実行される CI ビルドを定義することです。


編集:

もう 1 つのオプションは、ローカル ビルド中にプッシュプレリリース パッケージ(バージョン 1.0.0-alpha など) を NuGet サーバーに作成することです。これにより、開発者はリリース バージョンを作成する前にパッケージを試すことができます。

于 2014-08-05T22:27:41.953 に答える