2017-11-19 15 views
26

Có cách nào để tải phiên bản tiếp theo khi xuất bản lên một kho lưu trữ ở chế độ gradle không?Cách nhận số bản dựng tiếp theo trong Gradle

Ví dụ: nếu tôi có phiên bản 3.0.1 trong kho lưu trữ của mình, tôi muốn phiên bản đã xuất bản là 3.0.2.

ivy đã một nhiệm vụ cho ant tên buildnumber mà thực hiện chính xác rằng:

<project xmlns:ivy="antlib:org.apache.ivy.ant" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<target name="ivyBuildNumber" description="Use ivy get the next build number"> 
    <ivy:buildnumber 
     resolver="url-chain" 
     organisation="${ivy.organisation}" 
     module="${ivy.module}" 
     revision="${version.base}"/> 

    <echoproperties prefix="ivy.new."/> 
</target> 

Có cách nào để làm như vậy trong gradle? nếu không làm cách nào tôi có thể truy cập ivy nhiệm vụ từ số ant của gradle?

Trong build.gradle của tôi, tôi gọi đến ant

ant.importBuild 'build.xml' 
+0

Plugin có thể hiểu phiên bản tiếp theo là gì? Trong trường hợp của bạn, nó có thể là '3.0.2' hoặc' 3.1.0' hoặc '4.0.0'. Một số lib có thể có các tiêu chuẩn versioning hoàn toàn khác nhau, ví dụ phiên bản hibernate mới nhất là '5.2.12.Final'. –

+0

@ ileksandrShpota ant ivy: nhiệm vụ buildnumber thực hiện điều này khá tốt xem [this] (http://ant.apache.org/ivy/history/2.1.0/use/buildnumber.html) –

+0

Có thể nếu bạn sử dụng số bản dựng khác nhau. Ví dụ, nếu phiên bản của tôi là 1.2.4 số xây dựng của tôi có thể là 010204. Tôi đoán bạn có thể viết plugin của riêng bạn mà theo mặc định sẽ làm 1.2.4 -> 1.2.5 và 010204 -> 010205. Tôi chưa viết Gradle plugin cho đến nay vì vậy tôi không thể giúp bạn với điều đó. – TheKarlo95

Trả lời

4

Sau một thời gian dài làm việc, tôi đã làm được điều đó.

Trong build.gradle tôi tôi đã thêm đoạn mã sau này

ant.importBuild 'build.xml' 

task getNextBuild(dependsOn : ivyBuildNumber) { 
    doLast{ 
     def nextVersion = ant.properties['ivy.new.revision'] 
     println nextVersion 
    } 
} 

tôi nhập khẩu của tôi ant xây dựng tập tin, và tạo ra một nhiệm vụ mà các cuộc gọi công việc ivybuildnumber.

Có bản dựng của tôi.xml

<project xmlns:ivy="antlib:org.apache.ivy.ant"> 

    <target name="ivyBuildNumber"> 
     <path id="ivy.classpath" path="lib/ivy.jar" /> 
     <typedef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.classpath" /> 
     <ivy:buildnumber 
      organisation="daniel" 
      module="hello"/> 
     <echoproperties prefix="ivy.new."/> 
    </target> 
</project> 

Bởi vì IDE của tôi (Intellij), không có ivy.jar trong nội dung,
tôi nhập khẩu các ivy.jar từ thư mục gốc của tôi (lib/ivy.jar)

9

Tôi không nghĩ rằng có sự ủng hộ trong Gradle, nhưng bạn có thể thử sử dụng nhiệm vụ Ant. https://docs.gradle.org/current/userguide/ant.html#sec:import_ant_build

Một cách khác để thực hiện việc này là sử dụng một số loại plugin hoặc tác vụ tùy chỉnh để quản lý phiên bản.

1
  • Đối với hành vi chính xác này , Nhiệm vụ của Ivy buildnumber có thể được gọi bằng Gradle thuần túy mà không cần nhập bản dựng Ant:
configurations { 
    antTasks // define a new configuration 
} 

repositories { 
    mavenCentral() 
} 

dependencies { 
    antTasks("org.apache.ivy:ivy:2.4.0") // add Ivy library to it 
} 

ext { 
    // define the Ivy task, using the extra configuration as classpath extension 
    ant.taskdef(name: "ivyBuildNumber", 
       classname: "org.apache.ivy.ant.IvyBuildNumber", 
       classpath: configurations.antTasks.asPath) 

    ant.ivyBuildNumber(organisation: "daniel", module: "hello") 
    nextVersion = ant.properties["ivy.new.revision"] 
} 

task demo { 
    doLast { 
     println nextVersion 
    } 
} 
  • Nói chung, Gradle không có bất kỳ tương đương kèm để Maven phát hành Plugin, vì vậy người ta phải dựa vào các plugin. Một plugin vững chắc là gradle-release bởi ResearchGate, plugin còn lại là axion bởi Allegro Tech. Trước đây là phiên bản kiểu Maven cổ điển, sau này lấy SCM làm nguồn duy nhất của sự thật, loại bỏ việc tạo phiên bản trong các tệp xây dựng. Nhưng cả hai plugin này đều không cung cấp hành vi được yêu cầu chính xác.

  • Sự cố cá nhân của tôi về vấn đề phiên bản ban đầu là sử dụng một số plugin. Kể từ khi tôi sử dụng Bamboo như máy chủ CI tại nơi làm việc, nghĩa đen tất cả mọi thứ tôi đã làm với các plugin phát hành bằng cách sử dụng Gradle bị rơi trên máy chủ CI sớm hay muộn. Nó có thể đã hoạt động được vài tuần, nhưng mọi cập nhật máy chủ đều mang lại một số vấn đề. Tôi đã kết thúc bằng cách sử dụng SCM-ít tiếp cận với một quy ước đơn giản: sử dụng tên chi nhánh như phiên bản gốc, nối nó với xây dựng số (cả hai giá trị được cung cấp bởi máy chủ CI):

ext { 
    branch = System.getProperty("branch", "develop") 
    buildNumber = System.getProperty("buildNumber", "latest") 
    isRelease = System.getProperty("isRelease", "false").toBoolean() 
    artifactVersion = "${branch}${(isRelease ? ".$buildNumber" : "-SNAPSHOT")}" 
} 

máy chủ CI sau đó có thể được thiết lập để thực hiện lệnh sau

./gradlew -DisRelease=true -Dbranch=${git.branch} -DbuildNumber=${build.number} mavenPublish 

khi nút 'Phát hành' được đẩy. Ví dụ, xây dựng 12 của nhánh 3.0 sẽ tạo phiên bản 3.0.12 trong kho lưu trữ nhị phân.

Những lợi thế là:
+ phiên bản đi kèm miễn phí, giả sử các chi nhánh được đặt tên phù hợp
+ tự động tăng lên xây dựng số cũng đi kèm miễn phí
+ người ta có thể dễ dàng xuất bản các phiên bản tùy chỉnh
+ không plugins có nghĩa là không có vấn đề với bản cập nhật phiên bản Gradle
+ phương pháp này là chết đơn giản và luôn luôn làm việc

Những nhược điểm là:
- không có thẻ (không có thay đổi gì cả trong SCM - không có chi nhánh phát hành, vv), nhưng kể từ khi th Số bản dựng e luôn được biết, người ta có thể xem bản sửa đổi trong CI xây dựng lịch sử
- một số số bản dựng sẽ bị bỏ qua, rõ ràng (ví dụ: phiên bản tiếp theo sau 3.5.76 có thể là 3.5.84)

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