2008-12-09 31 views
24

Tôi hoàn toàn mất mát cách ivy nhiệm vụ kiến: xuất bản được cho là hoạt động.Làm thế nào để ivy: xuất bản tác phẩm?

Tôi hy vọng rằng tôi sẽ xây dựng bình thường, tạo ra một loạt các tệp jar, sau đó tôi sẽ đẩy các lọ đó đến kho lưu trữ cục bộ.

Làm cách nào tôi có thể chỉ định từ nơi để truy xuất các lọ được xây dựng và cách những thứ đó sẽ kết thúc trong kho lưu trữ?

Cập nhật:

<target name="publish-local" description="--> Publish Local"> 
    <ivy:retrieve /> 
    <ivy:publish resolver="local" pubrevision="${release.version}" status="release" update="true" overwrite="true"> 
     <artifacts pattern="${dist.dir}/[organisation]-[module].[ext]" /> 
    </ivy:publish> 
</target> 

này thực sự hoạt động, tôi đã không bao gồm lấy trước.

Nhưng tôi vẫn gặp một số vấn đề, giả sử tôi muốn xuất bản 3 lọ, openscada-utils.jar, openscada-utils-sources.jar và openscada-utils-javadocs.jar dưới dạng openscada-utils-0.9.2.jar , openscada-utils-0.9.2-sources.jar và openscada-utils-0.9.2-javadocs.jar

Nó không hoàn toàn rõ ràng đối với tôi, cách các tên thực tế được lắp ráp và nơi tôi có thể chỉ định tên họ sẽ nhận được. (Sử dụng đoạn trên, các lọ luôn được gọi là utils.jar).

Cập nhật 1:

tôi đã nhận nó để làm việc (một chút), nhưng nó vẫn không cảm thấy đúng. Bằng cách nào đó tất cả các hướng dẫn tập trung vào các phụ thuộc từ các dự án của bên thứ 3, nhưng một điểm quan trọng không kém đối với tôi là xử lý các phụ thuộc cụ thể của dự án.

Tôi có một loạt các dự án phụ phụ thuộc lẫn nhau theo nhiều cách khác nhau. Xem xét ivy: xuất bản nó không phải là rõ ràng với tôi làm thế nào để bắt đầu.

  1. Làm cách nào để xử lý phiên bản đầu tiên? Tôi có một số phiên bản phổ biến cho tất cả các dự án phụ để chỉ ra rằng chúng thuộc về nhau (cho phép nói 0.9). Do đó bản sửa đổi đầu tiên phải là 0.9.0, nhưng cho đến nay không có dự án nào của tôi nằm trong kho lưu trữ của tôi. Làm thế nào để tôi có được Ivy để chỉ định số sửa đổi này.

  2. Trong quá trình phát triển, tôi muốn xuất bản lại các tệp đã tạo, mà không thay đổi số sửa đổi cho đến thời điểm này.

  3. Nếu tôi kết thúc với tác phẩm của mình, tôi muốn đẩy nó vào một kho lưu trữ dùng chung (và tăng số sửa đổi cho phép nói từ 0.9.0 đến 0.9.1), cách tiếp cận được khuyến nghị để làm như vậy là gì?

  4. Để phát hành thực tế, tôi muốn phân phối với phụ thuộc và không, bằng cách nào đó tôi đoán tôi có thể sử dụng các cấu hình khác nhau cho điều đó. Làm thế nào tôi có thể sử dụng nó để lợi thế của tôi?

+0

Chỉ cần thông tin, theo [this] (http://ant.apache.org/ivy/history/latest-milestone/use/deliver.html) nhiệm vụ 'deliver' được gọi bởi tác vụ' publish'. – itudoben

Trả lời

9

Bạn cần chỉ định "người giải quyết". Một cái gì đó như:

<ivy:publish resolver="local" pubrevision="1.0"/> 

Nó được kiểm soát bởi mẫu. Điều này page bao gồm nó khá tốt. Có vẻ như bạn muốn của mình là:

<artifacts pattern="${dist.dir}/[organisation]-[module]-[revision]-[type].[ext]" /> 

Và bạn sẽ cần phải xác định ba lọ làm hiện vật trong tệp ivy.xml.Một cái gì đó như thế này:

<publications> 
    <artifact name="utils"/> 
    <artifact name="utils" type="source"/> 
    <artifact name="utils" type="javadocs"/> 
</publications> 
0

Điều quan trọng là nhận ra ivy đang làm gì ở đây. Nó không chỉ đơn giản là sao chép các lọ tạo tác của bạn vào kho lưu trữ ivy - nó cũng tạo ra các tệp ".ivy.xml" có liên quan chỉ định tất cả người phụ thuộc của mỗi tạo phẩm của bạn.

Dưới bìa, tác vụ ivy:retrieve thực sự cũng kích hoạt một ivy:resolve. Khi đó ivy: giải quyết xảy ra, một tập tin được ghi vào bộ nhớ đệm ivy cục bộ của bạn (trong thư mục .ivy trong user.home) xác định độ phân giải đã xảy ra (cần sửa đổi các mô-đun nào để hoàn thành giải pháp). Khi gặp phải ivy:publish bản ghi độ phân giải được lấy ra từ bộ nhớ cache và được sử dụng để tạo ra ivy.xml cho các tạo tác của bạn.

Lỗ hổng lớn nhất mà tôi thấy khi thực hiện điều này là yêu cầu các nhiệm vụ ivy:resolveivy:publish đều được tải bởi cùng một trình nạp lớp khi chúng được thực thi bởi ant. Cách dễ nhất để đảm bảo điều này xảy ra là sử dụng loaderRef trên các tác vụ taskdef của bạn. Ví dụ: (lưu ý các thẻ loaderRef phù hợp):

<taskdef name="ivy-retrieve" 
    classname="org.apache.ivy.ant.IvyRetrieve" 
    classpathref="ivy.lib" 
    loaderRef="ivy.loader"/> 
<taskdef name="ivy-publish" 
    classname="org.apache.ivy.ant.IvyPublish" 
    classpathref="ivy.lib" 
    loaderRef="ivy.loader"/> 
4

Trước tiên, bạn cần tệp ivy.xml.

<ivy-module version="2.0"> 
    <info organisation="com.example.code" module="MyProject" 
     revision="${project.revision}"/> 
    <configurations> 
     <conf name="runtime" description="" /> 
     ... other config elements here... 
    </configurations> 

    <publications defaultconf="runtime"> 
     <artifact name="MyProject" type="jar" ext="jar" conf="runtime" /> 
    </publications> 

    <dependencies> 
     ... 
    </dependencies> 
</ivy-module> 

Yếu tố thông tin và các yếu tố xuất bản trong ivy.xml cho phép bạn bỏ qua các thuộc tính khác nhau trên phần tử ivy trong build.xml.

Lưu ý $ {project.revision} trong ivy.xml. Thuộc tính được gán giá trị trong tệp build.xml, nhưng điều này có vẻ hoạt động tốt. Việc sửa đổi sau đó có thể dễ dàng có bất kỳ giá trị nào được yêu cầu (ví dụ: bản dựng hàng đêm so với bản dựng cục bộ).

Đây là một mẫu làm thế nào bạn có thể thiết lập file build.xml bạn

<property name="project.revision" value="1.0.0"/> 

... 

<target name="ivy"> 
    <ivy:resolve /> 

    <!-- Possible ivy:report, ivy:retrieve and other 
    elements for managing your dependencies go here --> 

    <ivy:deliver conf="*(public)"/> 
</target> 

<target name="publish" depends="clean, ivy, jar"> 
    <ivy:publish resolver="local"> 
     <!-- possible artifacts elements if your artifacts 
     are not in standard location --> 
    </ivy:publish> 
</target> 

... 
+0

Tham chiếu tốt http://draconianoverlord.com/2010/07/18/publishing-to-maven-repos-with-ivy.html –

2

Bạn đang giả sử để chạy các nhiệm vụ <ivy:deliver/> đầu tiên. Điều này tạo ra một tập tin ivy.xml có thể được sử dụng bởi kho lưu trữ Ivy.

Khi bạn sử dụng <ivy:publish> bạn chỉ định kho lưu trữ nào bạn muốn xuất bản bằng cách chỉ định kho lưu trữ trong thông số resolver. Điều này cần phải khớp với tên trình phân giải trong tệp ivy.settings.xml của bạn.

Bạn không thực sự chỉ định các tạo tác, nhưng là một mẫu để tìm các tạo tác xuất bản. Bạn chỉ định điều này thông qua phụ đề <artifacts> trên tác vụ <ivy:publish>. Ví dụ, nếu bạn xây dựng tất cả mọi thứ trong thư mục ${basedir}/target/archive giống như chúng ta, bạn có thể xác định nó như thế này:

<ivy:publish resolver="public"> 
    <artifacts path="target/archive/[artifact].[ext]"/> 
</ivy:publish> 

Nếu bạn muốn thay đổi số phiên bản của tập tin của bạn, bạn có thể sử dụng pubrevision tham số của nhiệm vụ <ivy:publish>. Điều này không cập nhật các ivy.xml, nhưng sẽ xuất bản lọ/cuộc chiến tranh của bạn để sửa đổi chính xác. Tôi thích sử dụng thông số pubrevision của tác vụ <ivy:deliver> và cho phép nó tạo tệp ivy.xml chính xác. Sau đó, <ivy:publish> sẽ sử dụng bản sửa đổi trong tệp ivy.xml của tôi.

Bạn không cần phải làm <ivy:retrieve>.Sau khi tất cả, bạn đang chạy một xây dựng để tạo ra các lọ mới, và họ nên được SOMEWHERE trong xây dựng của bạn. Nếu không, nếu bạn không tạo ra một cái lọ hay chiến tranh, bạn đang cố gắng phát hành gì vào kho lưu trữ Ivy của bạn? Và, bạn chắc chắn không muốn lấy một cái gì đó đã có trong kho lưu trữ Ivy của bạn chỉ để tái xuất bản nó.


Triết lý của tôi luôn xuất bản là nhiệm vụ CM và không nên được thực hiện như một phần của quy trình xây dựng. Do đó, chúng tôi không sử dụng <ivy:deliver> hoặc <ivy:publish>.

Chúng tôi sử dụng Artifactory làm kho lưu trữ Ivy của chúng tôi (và kho lưu trữ Maven của chúng tôi). Chúng tôi sử dụng Jenkins làm máy chủ tạo liên tục của chúng tôi.

Những gì tôi làm là để nhà phát triển tạo tệp pom.xml trong số ivy.xml tệp của họ thông qua nhiệm vụ <ivy:makepom>. Điều này và các jars xây dựng/chiến tranh được lưu lại như các hiện vật lưu trữ trong Jenkins.

Khi chúng tôi hài lòng với một bản dựng cụ thể và muốn nó trong kho lưu trữ công cộng của chúng tôi, tôi sử dụng nhiệm vụ Quảng bá của Jenkin để quảng bá một cuộc chiến/jar với pom.xml của nó đến kho lưu trữ Artifactory của chúng tôi. Chúng tôi sử dụng tác vụ mvn deploy:deploy-file để thực hiện điều đó.

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