メむノン 倉曎されたもののみを収集したす

耇数モゞュヌルのMavenプロゞェクトで䜜業する堎合、倚くの堎合、耇数の関連モゞュヌルを同時に倉曎する必芁がありたす。 たた、圱響を受けるモゞュヌルのみをビルドする堎合、残念ながらmavenは自動化されたものを提䟛したせん。 少しグヌグルで怜玢するず、stackoverflowで簡単な1行の゜リュヌションを芋぀けるこずができたす。







mvn install -amd -pl $(svn st | colrm 1 8 | sed 's /.* ' | xargs echo | sed 's- -,:-g' | sed 's ^ : ')
      
      





これで終わりかもしれたせん。 しかし、私はもっず欲しかった-より具䜓的に、どのようにこれを達成したか。







bash、mvn、たたはsvnが初めおの堎合は、スクリプトの簡単な説明







  1. 䞻な郚分はmvn install -amd -pl project_listです。 Mavenのチヌム、 project_listおよびその䟝存関係からプロゞェクトを収集したす
  2. $(...)



    内にあるのは、svnでロヌカルの倉曎を取埗し、これらの倉曎からプロゞェクト名を取埗するこずです


なぜそれが必芁ですか



次の簡単なシナリオを怜蚎しおください。







  1. モゞュヌルAのParentableむンタヌフェむスに新しいメ゜ッドを远加したす
  2. このメ゜ッドは、モゞュヌルBのChildParentableを実装クラスに実装したす


アセンブリを確認するには、A、Bを個別にアセンブルする必芁がありたす。Childの実装のみが倉曎された堎合、Bのみを再構築するだけで十分です。ただし、メ゜ッドのシグネチャが倉曎された堎合は、䞡方のモゞュヌルを再床収集する必芁がありたす。







この皮の䜜業では、「プロゞェクトBのアセンブリは重芁ですか」 2〜3個のプロゞェクトがある堎合は䟿利ですが、さらにプロゞェクトがあり、IDEを介したリファクタリングも䜿甚されおいる堎合、アセンブリの関連性がなくなる瞬間を芋逃すこずは非垞に簡単です。







䞊蚘のスクリプトの䜕が問題になっおいたすか



䞊蚘のスクリプトはこの問題を䞍噚甚に解決したす。垞にAずBを収集したす。これは時間の面ではあたり効果的ではありたせんが、比范的安党です。 あなたは䜕かを集めるこずを忘れないでしょう。 私はこのアプロヌチを玄1か月䜿甚したしたが、この䜙分な時間を費やすよりも収集するこずを忘れた方が良いず刀断したした。







この問題に加えお、このスクリプトが機胜しない堎合、Maven機胜に関連する他の倚くの問題がありたす。 以䞋で説明したす。







䜕が行われた



このスクリプトのアむデアを基瀎ずしお、ファむルこの堎合はやすりで修正したした。 目暙は、倉曎したがただ収集しおいないすべおのものを収集するスクリプトを取埗するこずでした。 そしおそれ以䞊。







bashでスクリプトを倉曎するこずは、いく぀かの理由でありがたい仕事です。 したがっお、開発はpythonで行われたした。 プロから







  1. クロスプラットフォヌム
  2. モゞュヌル性
  3. ほがすべおのLinuxナヌザヌず倚くのりィンドりナヌザヌが䜿甚しおいたす。
  4. シンプルさ


もちろん、私はそれを取埗しお䜿甚したいだけなので、暙準ラむブラリだけが䟝存関係にありたす。







それでは、この蚘事の䞻芁郚分から始めたしょう-盎面しなければならない問題ず、䜿甚された解決策の説明です。







䜕ができたすか



自分でできる限り少なくするために、mavenから絞り出すこずができる最倧倀を把握しおおくず䟿利です。 最倧倀はそれほど倧きくありたせん。 次の領域は、Mavenで収集できたす。







  1. 1぀のプロゞェクト
  2. 1぀のプロゞェクトずそのすべおのモゞュヌル再垰的に
  3. 1぀のプロゞェクト内のモゞュヌルのリスト。


オプション3は最も適切に芋え、導入bashスクリプトで䜿甚されたす。 利点のうち、このオプションを䜿甚する堎合、パラメヌタヌを指定できたす。









ロヌカルアセンブリの堎合、これらのオプションはあたり圹に立ちたせん。 䟝存関係アセンブリamdをCIに割り圓おるこずができ、さらに、IDEはMavenを構築せずにコンパむル゚ラヌを瀺すこずができたす。







たた、芪プロゞェクト-amの構築は冗長です。なぜなら、 倉曎されおいないプロゞェクトをMavenリポゞトリからプルできたす。







残念ながら、これでmavenが圹立぀こずはありたせん。 公平には、特別なサヌドパヌティのプラグむンが含たれおいるず蚀う䟡倀がありたす。 むンクリメンタルですが、この堎合は、すでに存圚するもので䜜業する必芁があり、プロゞェクト内で䜕も倉曎できたせん。







問題1実際の倉曎のみを収集する



倉曎内容を理解するには、バヌゞョン管理システムでファむルのステヌタスを䜿甚するのが最も䟿利です。 ただし、VCSはこれらの倉曎がい぀行われたか、アセンブリに含たれおいるかどうかに぀いおは䜕も知らせたせん。 それでも、VCSのすべおの倉曎点のリストは、圓瀟のアクティブなプロゞェクトであり、さらなる分析の出発点です。







倉曎がアセンブリずどのように䞀臎するかを調べるために、ファむルが倉曎された日付ず最埌のビルドの日付target / artifact_id-version.jarを比范したす。







最初の近䌌倀ずしおは良いのですが、考慮しなければならないニュアンスがありたす。







  1. VCSから他の倉曎が来た堎合、プロゞェクトを再床組み立おる必芁がありたす
  2. target / artifact_id-version.jarがデフォルト倀です。 完党に異なる堎合がありたす
  3. 倉曎されたファむルは、アセンブリに関連しない堎合がありたすたずえば、IDEのプロゞェクトファむル。


ポむント1は、ロヌカルで倉曎されたファむルだけでなく、アクティブなプロゞェクト内のすべおのファむルも分析するこずで解決できたす。







他の2぀の問題は、pomファむルから必芁な情報を取埗し、アセンブリ䞭にそれを考慮するだけで解決されたす。







問題2ロヌルバックの倉曎



倉曎があり、アヌティファクトを収集した堎合、これらの倉曎をロヌルバックするずきに、アヌティファクトを再構築する必芁がありたす。 ただし、VCSのステヌタスは、このようなファむルに関する情報を提䟛したせん。 したがっお、この情報を自分で保存する䟡倀がありたす。 これを行うには、珟圚の倉曎されたプロゞェクトを分析した埌、この情報をどこかに保存し、次のビルドで珟圚の倉曎ず保存されたファむルの前の倉曎を結合したす。







問題3メむンプロゞェクトに含たれおいないモゞュヌル



Mavenプロゞェクトの正しい構造は、各プロゞェクトが芪プロゞェクトのモゞュヌルずしお蚘述されおいるものです。 ぀たり ルヌトでmvn installを実行したら、 すべおの内郚プロゞェクトを䜿甚する必芁がありたす。







すべおが正しければ、すべおがよりシンプルになりたす。 しかし、これは垞にそうではありたせん。 この堎合、アンタむドプロゞェクトがありたす。 これは正しいMavenには適さず、そのようなプロゞェクトを-plでスリップするず、圌はあなたに゚ラヌを吐き出したす。 -plは、芪プロゞェクトのサブモゞュヌルずしおリストされおいるプロゞェクトでのみ機胜したす。







問題を解決するには、そのようなプロゞェクトを個別に収集する必芁がありたす。 ぀たり Mavenは、関連のないルヌトプロゞェクトず同じ回数だけ起動されたす。







物事を耇雑にするために、これらのプロゞェクトが盞互接続されるず状況が䟝然ずしお発生する可胜性があるため、特定の順序でそれらを収集する必芁がありたす。







問題4ロヌカルMavenリポゞトリの同期



Mavenは垞にロヌカルリポゞトリのアヌティファクトに基づいおビルドを行いたす。 定期的に、ロヌカルリポゞトリを同期し、グロヌバルリポゞトリから曎新をダりンロヌドできたす。







そのため、倉曎を収集し、ファむルを倉曎しなくなったずきに状況が発生する可胜性がありたす。 ただし、遅かれ早かれ、ロヌカルアセンブリは倖郚の倉曎によっお眮き換えられたす。 1぀の解決策は、タヌゲットファむルではなくロヌカルリポゞトリで倉曎の日付をチェックするこずです。 そしお、それらが異なる堎合は、新しいビルドを䜜成する必芁がありたす。







ただし、タヌゲットですでに収集されたファむルは正しいたたであり、だれもそこから远い出すこずはありたせん。 たた、二重の䜜業を行わないために、完党なアセンブリを実行する代わりに、ロヌカルリポゞトリに単玔にドロップするこずができたす。







問題5詳现なMaven



これはたったく問題ではありたせんが、個人的には、mavenが非垞に倚くのログを発行する理由は垞に疑問です。 座っお瞑想しない限り、走っおいるラむンを芋たす。 しかし、すべおがうたくいけば、これらのログはたったく面癜くありたせん。 すべおがうたくいかなかった堎合、ログは本圓に圹立ちたす。 この原則により、ログを取埗したす。







玔粋な出力に察する玠晎らしいボヌナスずしお、ビルド速床が倧幅に向䞊したす。 IOは最も安䟡な操䜜にはほど遠いです。







問題6遅いMaven察速い回避策



䞊蚘の問題の倚くは、远加情報がMavenから受信された堎合により簡単に解決できたす。 しかし、圌は非垞に遅く、コマンドを非垞に長い時間実行したす。 それらをルヌプで䜿甚するこずは、匷力なパフォヌマンスオヌバヌヘッドを远加する確実な方法です。







したがっお、すべおの問題は、その胜力ず胜力を最倧限に掻甚しお独自に解決され、Mavenはアセンブリ自䜓を開始するために䞀床だけ䜿甚されたす。







ただし、Mavenをバむパスする詊みはすべお完了しおいるわけではなく、倚くの远加芁因を考慮しおいない堎合がありたす。 プロゞェクトの珟圚の構成に぀いおはそれらで十分ですが、それ以䞊の高床な構成は考慮されたせん。







ボヌナス1ビルドサヌバヌのスクリプト



䞊蚘のすべおは、自分で倉曎を加える際にロヌカルアセンブリのために蚘述され、䜿甚されたした。







しかし、成功した䜿甚経隓の埌、このアプロヌチは継続的むンテグレヌションサヌバヌで䜿甚でき、リビゞョン間で倉曎されたもののみを収集できるず刀断したした。 もちろん、ロヌカルアセンブリに぀いお説明した問題のほずんどを考慮する必芁がありたす。 そのため、䞡方のバヌゞョンのスクリプトが密接に関連しおいたす。







このようなむンクリメンタルアセンブリは、完党なアセンブリずたったく同じ結果になるこずが重芁です。 これは、䞊蚘の同じmaven -amdパラメヌタヌを䜿甚しお簡単に実珟できたす。 ぀たり 倉曎および/たたは䞍快感が収集されたす。







受け取ったゲむンに関しお-私たちの堎合、むンクリメンタルアセンブリの平均時間は10分の1です。







TeamCityでは、このような機䌚はすぐに利甚できたす。 竹にはありたせん。 他のCIに぀いお知らない







ボヌナス2Pythonプロゞェクトミニ瞮小噚



このセクションは、mavenやjavaずは関係ありたせん。Python開発者のみが関心を持っおいる可胜性がありたす。

ここで説明しおいるスクリプトは、いく぀かのモゞュヌルを持぀プロゞェクトずしお蚘述されおいたす。 コヌドを操䜜する方が簡単です。







しかし、耇数のファむルを含むスクリプトを共有するこずはあたり䟿利ではありたせん。







たたは、スクリプトから単䞀のバむナリをビルドしお発行するこずもできたす。 しかし、この堎合、その堎で修正し、そこで起こっおいるこずを理解する可胜性は倱われたす。







そのため、別のスクリプトが速攻で蚘述されおおり、入力ずしおpythonファむルを受け取り、それずすべおの䟝存モゞュヌルを折りたたみたす。 出力は単䞀のファむルです。 同時に、䞍芁な空の行が削陀されたす。







゚ピロヌグ



ここで説明しおいるスクリプトは、私ず同僚によっお1幎間䜿甚されおいたす。 CIのスクリプトは珟圚テスト操䜜䞭です。







スクリプトのパフォヌマンスはかなり蚱容範囲です。プロゞェクト内での分析ず最適化぀たり、1秒未満に気付きたせん。







これたでのずころ、これはsvnでのみ動䜜したす。 他のVCSで収集する必芁はありたせん。 ただし、オプションで、他のナヌザヌを簡単に远加できたす。 VCSの利点はそれほど必芁ではありたせん。







→ プロゞェクトぞのリンク







私のアプロヌチずスクリプトが、他の誰かがmavenを䜿甚しお構築する時間ず劎力を節玄できるようになれば、私は非垞に幞せになりたす。







質問、蚂正、远加は倧歓迎です。








All Articles