2014-04-16 12 views
6

Cơ chế cơ bản được sử dụng để chỉ ra phiên bản của thư viện Scala nào được biên dịch chống lại là thêm _ < scala-version > vào tên của thư viện. Cách tiếp cận khá đơn giản này cho phép khả năng tương tác với người dùng Maven, Ant và các công cụ xây dựng khác. - sbt Documentation: Cross-Build Publishing ConventionsTại sao quy ước xây dựng chéo thêm phiên bản scala vào artifactId?

Trong khi đây là một cách tiếp cận đơn giản, khả năng tương tác với Maven và các công cụ xây dựng khác lá gì đó để được mong muốn. Bởi vì artifactId khác (ví dụ: scalatest_2.9.0scalatest_2.10.0), Maven coi chúng là các tạo tác khác nhau. Do đó, cơ chế phân giải phụ thuộc của Maven bị tổn hại và nhiều phiên bản của cùng một tạo tác (được xây dựng dựa trên các phiên bản scala khác nhau) có thể làm gió lên đường dẫn lớp.

Tại sao không đặt phiên bản scala trong trình phân loại? Điều này có vẻ là một trong những trường hợp sử dụng chính định cho trình phân loại:

Trình phân loại cho phép [Maven] phân biệt các tạo phẩm được xây dựng từ cùng một POM nhưng khác về nội dung của chúng. Là một động lực cho yếu tố này, hãy xem xét ví dụ một dự án cung cấp một mục tiêu giả tạo JRE 1.5 nhưng đồng thời cũng là một tạo phẩm vẫn hỗ trợ JRE 1.4. Tạo phẩm đầu tiên có thể được trang bị với trình phân loại jdk15 và phiên bản thứ hai với jdk14 sao cho khách hàng có thể chọn cái nào để sử dụng. - Maven Documentation: POM Reference

+0

Tôi nhớ quyết định này được đưa ra, một vài năm trước và tôi gần như chắc chắn rằng việc sử dụng trình phân loại đã được thảo luận và từ chối, với tất cả đồng ý rằng đó không phải là giải pháp khả thi. Những gì tôi không thể nhớ là tại sao! –

+0

@SethTisue Cảm ơn gợi ý. –

Trả lời

6

Phụ thêm phiên bản với tên là một quyết định lịch sử đã được thực hiện từ lâu rồi nên nó có khả năng sẽ xảy ra không thay đổi kể từ nhiều thư viện đã được công bố với quy ước rồi. Có nói rằng, như Seth đã lưu ý, đã có một cuộc thảo luận để xem lại chủ đề này cách đây vài năm khi sbt 0.12 rút ngắn "_2.10.0" postfix thành "_2.10" để tận dụng khả năng tương thích nhị phân của thư viện Scala giữa phiên bản nhỏ. Dưới đây là Mark từ [0.12] plan:

By versioning chéo, ý tôi là việc thực hành bao gồm một số phần của phiên bản Scala trong ID module để phân biệt một artifact được tạo ra bởi biên dịch mã nguồn tương tự đối với các phiên bản khác nhau Scala. Tôi không có nghĩa là khả năng xây dựng chống lại nhiều phiên bản Scala sử dụng +task, mà sẽ ở lại; Tôi chỉ đề cập đến quy ước phiên bản chéo.

[snip]

Nó luôn luôn là một hack để mã hóa này trong các định dạng pom.xml cứng nhắc và tôi nghĩ rằng nó có thể là tốt nhất để di chuyển ra khỏi này cho các dự án xây dựng chống Scala 2.10 và sau đó. Tuy nhiên, có lẽ điều này tốt hơn bất kỳ giải pháp quảng cáo nào có thể thay thế. Tôi không thấy người dùng các công cụ xây dựng khác làm điều này, vì vậy tôi hy vọng không có gì thay thế được.

Một nơi nào đó xuống thread Josh suggested:

(1) phân loại Scala. Đây có thể là các chuỗi tùy chỉnh có thể được chỉ định với các phụ thuộc. Ít nhất, IIRC này sẽ hoạt động.

Dưới đây là Mark response:

làm có ý nghĩa gì bởi "có thể được chỉ định với phụ thuộc"? Chỉ có một pom cho tất cả các classifier, đúng không? Làm thế nào bạn có thể khai báo các phụ thuộc khác nhau cho mỗi phân loại?

Dưới đây là một số nhận xét thú vị hơn về phân loại từ Geoff Reedy

tôi cũng nghĩ rằng phân loại sẽ là cách hoàn hảo để đối phó với vấn đề này đặc biệt là trong bối cảnh các gợi ý trong tài liệu maven rằng phân loại java-1.4java-1.5 được sử dụng để phân biệt giữa các lọ thích hợp cho nền tảng tương ứng. Lỗ hổng gây tử vong có vẻ là quản lý phụ thuộc transitive. Tức là, không có cách nào để chọn tập hợp phụ thuộc chuyển tiếp dựa trên trình phân loại được sử dụng để yêu cầu mô-đun . Chúng tôi cần phải có thể nói rằng khi bạn đang sử dụng mô-đun này với trình phân loại scala-2.10, nó sẽ mang các phụ thuộc của riêng nó bằng cách sử dụng trình phân loại scala-2.10 và khi được sử dụng với trình phân loại 2.9 mang lại số riêng của nó với phân loại scala-2.9.

Tôi nghĩ rằng với các phiên bản jvm có thể thực hiện công việc này vì phiên bản jvm có hỗ trợ đặc biệt trong kích hoạt hồ sơ có thể có thể kiểm soát phụ thuộc.

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