2016-07-20 15 views
6

Hiện tại chúng tôi đang thiết lập dự án sử dụng Ivy để quản lý sự phụ thuộc và Ant làm công cụ xây dựng chung (mặc dù có thể không liên quan ở đây). Ngoài ra chúng tôi có một loạt các thư viện được xây dựng với Maven và các dự án (chúng tôi có nhiều trong số đó) phụ thuộc vào. Chúng tôi biết rằng tình trạng này là rất xa lý tưởng và chúng tôi đang đánh giá các cách để cải thiện điều đó nhưng chúng tôi không thể thay đổi điều đó nhanh như chúng tôi muốn. Vì vậy, chúng tôi phải làm việc với những gì chúng tôi có vào lúc này. Nhưng dù sao, đây là vấn đề: nó làm việc với Maven 2 và Ivy nhưng gần đây chúng tôi bắt đầu chuyển sang Maven 3 vì nhiều lý do (một giải pháp xung đột tốt hơn) và loại kết hợp đó đã phá vỡ các bản dựng của chúng tôi.Apache Ivy và repo Maven địa phương - cách xử lý ảnh chụp nhanh được xây dựng với Maven 3

Trước tiên, tôi sẽ cố gắng mô tả cách các bản dựng của chúng tôi hoạt động với Maven 2 và Ivy. Sau đó tôi sẽ thêm nơi đó đã phá vỡ khi chuyển sang Maven 3.

Ivy + Maven 2

Khi phát triển các phiên bản mới của các thư viện của chúng tôi, chúng tôi đang sử dụng phiên bản SNAPSHOT, đã được cài đặt vào địa phương Maven repo (.m2). Ngoài ra, chúng tôi triển khai các ảnh chụp nhanh đó vào Artifactory của chúng tôi để có thể chia sẻ các bản dựng trung gian để cho phép phát triển song song.

Dự án của chúng tôi sau đó tuyên bố sự phụ thuộc vào các ảnh chụp nhanh đó. Ivysettings.xml tương ứng trông giống như sau:

<ivysettings> 
    <settings defaultResolver="default" /> 
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml" /> 
    <resolvers> 
    <ibiblio name="public" root="path.to.our.artifactory" m2compatible="true" /> 

    <filesystem name="local-maven2" m2compatible="true" checkmodified="true" changingPattern=".*SNAPSHOT">  
     <ivy pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision].pom" /> 
     <artifact pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" /> 
    </filesystem> 
    <filesystem name="local" checkmodified="true" changingPattern=".*SNAPSHOT"> 
     <ivy pattern="${ivy.local.default.root}/${ivy.local.default.ivy.pattern}" /> 
     <artifact pattern="${ivy.local.default.root}/${ivy.local.default.artifact.pattern}" /> 
    </filesystem> 
    <filesystem name="local2" checkmodified="true" changingPattern=".*SNAPSHOT"> 
     <ivy pattern="${user.home}/.ivy2/cache/[organisation]/[module]/ivy-[revision].xml" /> 
     <artifact pattern="${user.home}/.ivy2/cache/[organisation]/[module]/[artifact]-[revision].[ext]" /> 
    </filesystem> 

    <chain name="default" checkmodified="true" changingPattern=".*SNAPSHOT"> 
     <resolver ref="local" /> 
     <resolver ref="local-maven2" /> 
     <resolver ref="public" /> 
    </chain> 
    </resolvers> 
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml" /> 
</ivysettings> 

Do thiết lập này, nên tìm phiên bản mới hơn của ảnh chụp nhanh và giải quyết chính xác. Các phiên bản mới hơn được xác định bằng cách so sánh ngày tệp của tệp .pom tương ứng.

Khi chúng tôi tạo ảnh chụp nhanh với Maven 2, tệp .pom tương ứng sẽ lấy ngày tệp của bản dựng hiện tại và do đó kiểm tra hoạt động và Ivy sẽ giải quyết các phiên bản chụp nhanh chính xác.

Ivy + Maven 3

Độ phân giải mô tả ở trên phá vỡ khi xây dựng các bức ảnh chụp với Maven 3. Lý do dường như là các tập tin cài đặt .pom không nhận được dấu thời gian hiện tại như ngày tập tin của nó nhưng giữ ngày tệp của tệp pom.xml gốc được sao chép. Do đó Ivy không thể phát hiện xem ảnh chụp có mới hơn nữa hay không.

Dường như Maven 3 lưu dấu thời gian cập nhật trong maven-metadata-local.xml nhưng Ivy không đọc chúng. Chúng tôi biết rằng có trình phân giải ibiblio (mà chúng tôi đang sử dụng) nhưng vẫn ghi nhận những gì chúng ta biết (ví dụ: từ các câu hỏi như this) nó có nghĩa là làm việc với kho lưu trữ thực sự và có thể tạo ra các vấn đề khi được áp dụng cho repo .m2 cục bộ.

Chúng tôi cũng nghĩ về việc theo dõi ngày tệp của các tệp khác, ví dụ: maven-metadata-local.xml hoặc các tạo phẩm thực tế, nhưng chúng tôi không chắc liệu đó là khôn ngoan hay có thể phá vỡ bản dựng trong các tình huống khác.

Vậy chúng ta nên/chúng ta có thể giải quyết điều đó như thế nào?

TL; DR

gì là tiêu chuẩn/gợi ý cách để xử lý Ivy phụ thuộc vào bức ảnh chụp mà được xây dựng với Maven 3 và triển khai trong repo .m2 địa phương?

CẬP NHẬT 2016-07-26

Dưới đây là 2 điều tôi đã cố gắng để giải quyết vấn đề này nhưng tôi không chắc liệu sẽ có bất kỳ tác dụng phụ tôi không nghĩ đến. Tôi muốn được biết ơn nếu ai đó có thể làm sáng tỏ về điều này:

  1. Sử dụng hệ thống tập tin phân giải cho kho .m2 địa phương nhưng trong conjection với một bộ nhớ cache trong đó có useOrigin="true" (và tùy chọn một DefaultTTL thấp). Bằng cách đó, dường như chỉ có các tệp xml được lưu trữ trong bộ nhớ cache .ivy2 và các tạo phẩm được tham chiếu trong kho .m2, nghĩa là chúng không được sao chép. Điều này dường như làm việc nhưng tôi không chắc liệu nó sẽ như thế nào nếu tra cứu đầu tiên sẽ tải xuống ảnh chụp từ kho lưu trữ ảnh chụp nhanh được chia sẻ (Artifactory) và những bản cập nhật sẽ được cập nhật bởi một bản dựng cục bộ sau này. Trong trường hợp đó chúng tôi có thể sẽ kết thúc với phiên bản từ xa của artifact được lưu trữ trong .ivy2 và một phiên bản mới hơn đang được cài đặt vào .m2 với ngày .pom file là như nhau trong cả hai trường hợp.
  2. Sử dụng trình phân giải ibiblio với root="file://${user.home}/.m2/repository/" có vẻ như có khả năng giải quyết hầu hết các hiện vật (ngoại trừ xem bên dưới) nhưng vẫn có vẻ thất bại khi đọc siêu dữ liệu, tức là nó không cập nhật bộ nhớ cache với phiên bản mới hơn. trong repo .m2.

    Trong khi có thể giải quyết hầu hết các hiện vật trong repo .m2, tôi dường như gặp lỗi độ phân giải cho một vài "url" như file://{user.home}/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar trong khi hiện vật tồn tại, tức là tôi sao chép đường dẫn trực tiếp từ Windows Explorer và nó là "${user.home}\.m2\repository\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar".
+0

Tại sao sử dụng trình phân giải ibiblio làm phiền bạn? Bạn sử dụng một kho lưu trữ từ xa. – davidxxx

+0

@davidhxxx nó không phải là loại bỏ repo hoặc giải quyết ibiblio đó là vấn đề nhưng về cơ bản chúng tôi có 3 lớp khi xây dựng các dự án của chúng tôi: 1. ivy cache 2. local m2 repo 3. remote repo - và chúng ta cần tất cả 3. – Thomas

Trả lời

3

... Chúng ta biết rằng tình trạng này là xa lý tưởng và chúng tôi đang đánh giá cách để cải thiện điều đó nhưng chúng ta có thể ...

hoàn toàn bình thường trong kinh nghiệm của tôi. Nhiều công ty lớn có rất nhiều dự án được xây dựng với hỗn hợp ANT, Maven và Gradle ngày càng tăng.

gì sau một vài khuyến nghị tôi sẽ làm

Sử dụng một trình quản lý kho

Cách tốt nhất để tích hợp các công nghệ khác nhau là để chạy một kho lưu trữ trung gian để giữ tất cả xây dựng đầu ra. Điều này sẽ có hiệu quả tách bước xây dựng của bạn từ cách thức các đồ tạo tác nhị phân sau đó được tiêu thụ.

Các khuyến cáo công nghệ kho lưu trữ một kho Maven (tiêu chuẩn Java vào thời điểm này) và bạn có thể lựa chọn các công nghệ mã nguồn mở có sẵn để lưu trữ kho của bạn:

Trong khi chạy một máy chủ phụ có thể xuất hiện là một chi phí, nó sẽ trả lại số tiền tương đương với số r của các dự án phụ thuộc tăng (có một hệ thống tập tin chia sẻ lớn duy nhất không quy mô).

Trong mọi trường hợp, bạn cần phải có bản sao tham chiếu các tệp nhị phân phát hành của mình.Các trình quản lý kho lưu trữ Maven này cho phép bạn kiểm soát các phụ thuộc của bên thứ ba mà các dự án của bạn tiêu thụ và giúp lưu trữ các tệp thực sự giảm thời gian xây dựng của bạn và đơn giản hóa việc quản lý phụ thuộc được chia sẻ.

Cuối cùng, cách cấu hình một ivy build sử dụng kho lưu trữ Maven? Như sau bằng cách sử dụng ibiblio resolver (và bạn sẽ khám phá ra rằng tất cả các công cụ hiện đại xây dựng Java có hỗ trợ tương tự cho một kho Maven địa phương)

<ivysettings> 
    <settings defaultResolver="myrepo"/> 
    <resolvers> 
     <ibiblio name="myrepo" m2compatible="true" root="http://myrepo.com/path/to/repo"/> 
    </resolvers> 
</ivysettings> 

Cẩn thận với các phiên bản chụp

phiên Snaphot là một khái niệm được giới thiệu bởi Maven , đó là một khung xây dựng có ý kiến. Theo tôi cần phải rất thận trọng khi sử dụng chúng:

Như bạn đã phát hiện ra bức ảnh chụp liên tục thay đổi và không thể dựa vào khi chia sẻ với một nhóm người mong đợi một arefect không thay đổi cho thử nghiệm (như QA).

Suy nghĩ của tôi về vấn đề này đã được hình thành bởi việc niêm yết sau đó thảo luận về cách tiếp cận Maven để phát hành quản lý:

Cuối cùng, trong khi tôi muốn khuyên bạn nên hạn chế việc sử dụng các bức ảnh chụp để các nhóm cộng tác chặt chẽ, ivy không hỗ trợ họ, chỉ có một số giới hạn nổi tiếng trong việc sử dụng chúng. Bởi vì chúng là một cấu trúc Maven, chúng không được hỗ trợ 100% bởi các công nghệ xây dựng khác. Đây là nơi mà một người quản lý Repository thực sự giúp khi họ đang có khả năng tái tạo các siêu dữ liệu chính xác để hỗ trợ các phiên bản chụp:

Hope this helps.

+0

gợi ý, tôi sẽ xem xét chúng. Tôi có thể không hoàn toàn rõ ràng trong câu hỏi của tôi nhưng chúng tôi đang sử dụng Artifactory đã được xử lý các resolver thứ 3 (một ibiblio) trong chuỗi của chúng tôi. Thư viện của chúng tôi cuối cùng cũng được triển khai ở đó nhưng trong quá trình phát triển, chúng tôi không thể triển khai ảnh chụp nhanh để không can thiệp vào người khác (và có nhiều tình huống mà nhiều nhà phát triển đang làm việc trên cùng một thư viện) - và như bạn đã nói,) chỉ phát triển. – Thomas

+0

@Thomas Ahh, xin lỗi tôi đã bỏ lỡ tham chiếu đến Artifactory trong câu hỏi của bạn. Trình phân giải hệ thống tệp ivy không thể đọc tệp siêu dữ liệu Maven cho khách hàng biết là bản phát hành ảnh chụp mới nhất. Rất may, trình giải quyết ibilio có thể, nhưng điều này có nghĩa là bạn sẽ cần phải xuất bản các ảnh chụp nhanh của bạn lên Artifactory. –

+0

Tôi đã xem các liên kết bạn đăng nhưng tiếc là tôi không thấy bất kỳ điều gì ngay lập tức giúp giải quyết vấn đề của chúng tôi. Tuy nhiên, tôi đã thử một vài thứ và thêm vào câu hỏi của tôi. Nếu bạn có thể có một cái nhìn vào những người đó sẽ là tuyệt vời. – Thomas

Các vấn đề liên quan