2013-11-25 20 views
5

Có cách nào để xác định thuộc tính teamcity ['build.number'] từ dòng lệnh không? Tôi đã thử -Pteamcity.build.number = 1 nhưng nó không hoạt động.Làm cách nào để xác định thuộc tính teamcity ['build.number'] trong gradle từ dòng lệnh

Tôi có một tập tin build.gradle với nhiệm vụ này trong đó:

distTar { 
    baseName = project.name+'.'+ 
       project.version+'.'+ 
       System.getProperty("system.rnf.brach_name")+'.'+ 
       teamcity['build.number']+'.'+ 
       teamcity['build.vcs.number.1'] 

    archiveName = baseName+'.tar' 
    into(baseName) { 
     from '.' 
     include 'config/*' 
     include 'run-script/*.sh' 
    } 

} 

Nó hoạt động trên máy chủ xây dựng, nhưng nó khiến tất cả các nhà phát triển điên, bởi vì chúng tôi không có TeamCity được cài đặt trên máy của chúng tôi và bất kỳ lệnh gradle cho chúng ta một lỗi:

$ gradle tasks 

FAILURE: Build failed with an exception. 

* Where: 
Build file '/home/me/work/myproject/build.gradle' line: 31 

* What went wrong: 
A problem occurred evaluating root project 'myproject'. 
> Could not find property 'teamcity' on task ':MyProject:distTar'. 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Trả lời

8

với kịch bản mà bạn mô tả - cho phép các nhà phát triển để chạy một xây dựng trên máy tính địa phương của họ mà cũng cần phải chạy trong TeamCity - tôi thấy điều này làm việc cho tôi (TeamCity 7):

if (hasProperty("teamcity")) { 
    version = teamcity["build.number"] 
} else { 
    version = '0.0-beta' 
} 

Theo mặc định, gradle các tệp jar được tạo ra sẽ tự động sử dụng 'phiên bản' trong tên của chúng. Vì vậy, với mã này trong tệp build.gradle, các bản xây dựng dành cho nhà phát triển sẽ có các tạo phẩm được gắn thẻ với '0.0-beta' và các phiên bản TeamCity của cùng một dự án nhận số xây dựng TeamCity.

Nhưng nếu bạn muốn, ví dụ, thêm thông tin vào biểu hiện bạn sẽ làm điều gì đó như:

jar { 
    manifest { 
    attributes 'Implementation-Title': rootProject.name, 'Implementation-Version': version 
    } 
} 

Tôi hy vọng rằng sẽ giúp?

+0

Giải pháp này không làm việc cho tôi vì đó là vì https://issues.gradle.org/browse/GRADLE-1826 này. Nhưng tôi đã thay đổi hasProperty ("teamcity") thành rootProject.hasProperty ("teamcity") và bây giờ nó hoạt động. Cảm ơn bạn anyway! – MistaGreen

0

làm việc này từ dòng lệnh

task hello << { 
    println project.ext['teamcity.build.number'] 
} 

và bạn gọi nó

gradle hello -Pteamcity.build.number=1.45 

hy vọng rằng sẽ làm việc cũng trong kịch bản của bạn

+0

No. Tôi đã thử nó rồi: Không thể tìm thấy thuộc tính 'teamcity' trên task ': MyProject: distTar'. – Gavriel

+0

bạn có vấn đề gì với phương pháp tiếp cận project.ext? với nhiệm vụ hello nó làm việc một cách chính xác mặc dù tôi đã thay đổi từ teamcity ['build.number'] thành project.ext ['teamcity.build.number'] dù sao thì bạn có thể làm việc đó xung quanh –

0

Đó là một chút hack, nhưng đây là giải pháp tạm thời tôi đã đưa ra. Vẫn đang chờ đợi một tốt hơn mặc dù.

trong build.gradle Tôi nói thêm:

if (hasProperty("dev")) { 
    apply from: 'teamcity.gradle' 
} 

Tôi có điều này trong teamcity.gradle:

task teamcity { 
    teamcity['build.number'] = 1 
    teamcity['build.vcs.number.1'] = 0 
} 

Và tôi có điều này trong gradle.properties:

dev=1 

gradle .properties và teamcity.gradle nằm trong .gitignore. Tùy chọn thay vì thêm dev = 1 vào gradle.properties, bạn có thể định nghĩa nó trong dòng lệnh: -Pdev = 1, theo cách này bạn có thể thực hiện hoặc không có hack trên cùng một máy (mặc dù tôi không nghĩ nó hữu ích)

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