どうすれば「依存関係管理」を主張できますか?


9

私は現在、ビルド(ala Maven、Ivy、NuGet)の依存関係管理を採用し、共有モジュールの内部リポジトリを作成することを主張しています。このビルド手法の主なセールスポイントは何ですか?私がこれまで持っているもの:

  • 共有モジュール、特にバージョンのアップグレードの配布とインポートのプロセスを容易にします。
  • 共有モジュールの依存関係を正確に文書化する必要があります。
  • ソース管理から共有モジュールを削除し、チェックアウト/チェックインを高速化および簡略化します(20以上のライブラリを使用するアプリケーションがある場合、これは実際の要因です)
  • 組織で使用されているサードパーティのライブラリをより詳細に制御または認識できます。

私が見逃しているセールスポイントはありますか?改善の指標を示す研究や記事はありますか?


1
あなたはそれを釘付けにしたと思います。
マイクパートリッジ

4
壊れたMavenセットアップで無駄に費やされた何時間もの人生を取り戻すことは決してできません。善意に関係なく、大規模な軍団では、それが最終的には維持されていない混乱になり、あなたが中空の殻になるまで、あなたの人生を吸い取ってしまうと確信しました。
MrFox

1
@suslik Careは、「壊れたMaven」設定とは何かについて詳しく説明しますか?
アンドリューT

1
@AndrewFinnellたとえば、ビルドをコンパイルするために引き込む必要があるプロジェクトに取り組んでいる5つのグループがあるとします。調整が不十分なため、ライブラリのバージョンが異なると、だれもが結果的になってしまいます。その後、プロジェクトの1つがまだ「リリース」されることを意図していないことが判明しましたが、(誰もmavenに言わなかった!)満たす必要のある依存関係があります。これは「想定」されているわけではありませんが、自動解決によって簡単になりすぎます。誰もがsvnで維持する/ libsディレクトリを持っている場合、手に負えなくなる前に人々に立ち止まって質問を強いることになります。
MrFox

2
@MrFoxこれは確かに調整が不十分なためであり、Maven依存関係の解決ではありません。私は同じ状況を経験しており、Mavenのファンではありませんが、ツールは時期尚早のリリース、コミュニケーションの欠如、テストの欠如、不十分なメンテナンスなどの人間関連の問題を解決するためのものではないと思います
スクリプト

回答:


8

私はポジティブについて100%確信が持てません。ここにいくつかの欠点があります

  1. 多くの場合、安定していない可能性のあるサードパーティのサーバー/エンドポイントに依存関係を追加することになります。

    bowerで、一部の依存関係のリポジトリが削除または移動されたことがありました。新しい開発者がやって来て、私のリポジトリのクローンを作成してタイプし bower install、アクセスできないリポジトリのエラーを取得します。代わりに、サードパーティのコードをリポジトリにチェックインした場合、その問題は解消されます。

    これは、実行しているサーバーに保持されているコピーからdepをプルする場合にOPが提案するように解決されます。

  2. 初心者には難しい。

    コマンドラインの経験がほとんどない美術の学生と仕事をしています。彼らは、Processing、arduino、Unity3Dでアートを作り、ほとんど技術的な知識は必要ありません。彼らは私が書いたHTML5 / JavaScriptを使いたかったのです。バウアーのためのステップ

    1. githubからリポジトリのZipをダウンロードします(githubのすべてのリポジトリの右側にあります。gitを知らないためです)。
    2. ノードをダウンロードしてインストールします(bowerをインストールするためにnpmを実行できます)
    3. gitまたはmsysgitをインストールします(bowerはそれを必要とし、多くの学生のマシンにはインストールされていないため)
    4. バウアーをインストール(npm install -g bower
    5. bower install (最終的に依存関係を取得するため)

    githubリポジトリにファイルをチェックインするだけで、手順2〜5をすべて削除できます。これらの手順は、おそらくあなたと私にとって非常に簡単に聞こえます。学生にとって、彼らは非常に混乱していて、すべてのステップと目的は何であるかを知りたいと思っていましたが、それ良い学習である可能性がありますが、クラスのトピックと完全に直交していて、すぐに忘れられた可能性があります。

  3. それは引っ張るときに別のステップを追加します。

    それを何度も繰り返しgit pull origin masterてからコードをテストするとbower install 、最新の詳細を取得するために入力する必要があることを覚えておくのに5〜10分かかります。これはプルスクリプトフックで簡単に解決できます。

  4. gitの分岐が難しくなります

    2つのブランチが異なる依存関係を持っている場合、一種のねじ込みです。bower install毎回入力できると思いますgit checkout。スピードについてはこれで終わりです。

あなたのポジティブについては、それぞれに反例があると思います

共有モジュール、特にバージョンのアップグレードの配布とインポートのプロセスを容易にします。

対何?配布は確かに簡単ではありません。20の代わりに1つのリポジトリを取得するのは簡単ではなく、失敗する可能性が高くなります。上記の1を参照

ソース管理から共有モジュールを削除し、チェックアウト/チェックインを高速化および簡略化します(20以上のライブラリを使用するアプリケーションがある場合、これは実際の要因です)。

逆に、修正のために他の人に依存することを意味します。depがサードパーティのソースから取得していて、バグを修正する必要がある場合は、パッチが適用されるまで待つ必要があります。さらに悪いことに、おそらく、必要なバージョンとパッチだけを取得することはできません。プロジェクトとの下位互換性がない可能性がある最新のバージョンを取得する必要があります。

あなたはそれらのリポジトリを別々にクローンすることでそれを解決できます、そしてあなたはあなたのコピーにあなたのプロジェクトの担当者を指すようにします。次に、修正をコピーに適用します。もちろん、ソースをリポジトリにコピーするだけでも、それを行うことができます

組織で使用されているサードパーティのライブラリをより詳細に制御または認識できます。

それは議論の余地があるようです。開発者がサードパーティのライブラリをの下の独自のフォルダに配置することを要求するだけです<ProjectRoot>/3rdparty/<nameOfDep>。使用されているサードパーティのライブラリを簡単に確認できます。

ポジティブがないと言っているのではありません。私が最後に参加したチームは100を超えるサードパーティの担当者でした。私はそれがすべてのバラではないことを指摘しているだけです。たとえば、自分のニーズに合わせてバウアーを取り除くべきかどうかを評価しています。


うわー、多くの反対票とそれらのための単一の正当化ではありません。よくやった!:(
gman 2014年

私はバウアーを使用したことがありませんが、installチェックアウトするたびに必要になることはデザイン上の欠陥のようです。プロジェクトをビルドするときに設定を確認する必要があります。変更がある場合は、最初から再ビルドする必要があります。また、リポジトリの移動は、コードを含む実際のリポジトリではなく、アーティファクトを格納するMavenリポジトリからアーティファクトを取得するため、Mavenには関係ありません。あなただけ変更することができますartifactIdし、groupIdあなたのアーティファクトの次のバージョンでは、Mavenのリポジトリにそれを公開する場合。したがって、ポイント#1と#4は特にMavenにはほとんど関係ありません。#3はmvn clean(時々)に置き換えることができます
スクリプト

真実である一方で、#2は不利ではありません-それはトレードオフです。もちろん、ツールを習得する必要があります!たとえば、Gitは把握するのがかなり難しいですが、dem noobsであるため、あきらめるつもりはありません。
スクリプト

1

見てみましょう十二要因のアプリを起動します

特に、依存関係について彼らが言わなければならないことについて読んでください。優れた設計は、依存関係を特定するための宣言的なメカニズムを提供することに気づくでしょう。Javaでは、これは多くの場合Mavenを通じて実現されます。IvyとNuGetは問題なく動作しますが、Mavenは現在この分野のリーダーであり、Ivyは明らかに大変な作業です。

Mavenのリリースプロセス(正式なリリースの準備ができるまでスナップショットを開発し、以前のリリースを上書きしないでください。NexusやArtifactoryなどの適切なリポジトリマネージャーを使用してください)を遵守する場合は、適切に機能するビルドプロセスが必要です。

確実な宣言型ビルドプロセスが整ったら、Jenkinsとの継続的インテグレーション、Sonarを使用した継続的コード分析など、他の優れた実践への扉が開かれ、gitを使用したより優れたバージョン管理分岐戦略が求められます。

上記のそれぞれは、Mavenであるコアに基づいて構築されています。最近では、それはかなり簡単な決定です。


私はTwelve Factor Appを調べましたが、それは非常に論争の的であり、関連するのはほんの少しだけです。また、Mavenをプッシュしても、依存関係の注入が必要な理由を説明できません。全体的に、この回答は依存性注入を販売するのに役立ちませんが、ビルドプロセスで実行する必要がある多くのことを教えてくれます。
C.ロス

2
依存関係注入(設計パターン)は、依存関係管理(ビルドパターン)ではありません。質問の最も重要な側面はすべてカバーしました。あなたのチームがそれらを聞いた後でそれでも説得が必要な場合は、依存関係管理が何につながるかを見ることは最終的な説得者であるべきです。
Gary Rowe

0

そして、トップ10リストの#1アイテムは...

(ドラムロール)

すべての開発者は、すべての依存関係のまったく同じバージョンを使用してビルドするので、本番環境に何をデプロイするかを気にする必要はありません。


2
依存関係をチェックインすることと何が違うのですか?実際、依存関係をチェックインしないと、サードパーティがディストリビューションを壊してしまう危険があります。誰かが削除または名前を変更したリポジトリをいくつかのバウンダップが指す場合、私はこれが複数回発生しました。ソースをリポジトリにコピーしたばかりなら、その問題はなくなります。
gman 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.