2013-02-26 25 views
11

Vì bạn chỉ có khả năng tương thích nguồn giữa Scala -nguyên tắc bạn không cần phải biên dịch các thư viện như scalatest hoặc scalamock cho mỗi phiên bản scala mà chúng hỗ trợ. Điều làm tôi khó hiểu là các thư viện được cung cấp với vô số các tạo phẩm (scalatest_2.9.0, scalatest_2.9.1, scalatest_2.10 và vv) - một cho mỗi phiên bản scala, như vậy kho lưu trữ maven được rải rác với nhiều đồ tạo tác được xây dựng từ cùng một nguồn. Bản năng của tôi nói với tôi thay vì sử dụng một tạo phẩm với một trình phân loại cho mỗi phiên bản scala. (Trong thực tế, các maven pom reference đề cập rằng điều này đôi khi được thực hiện với jdk14 và jdk15 phân loại cho hiện vật, mà có vẻ tương tự như tôi.) Vì vậy, tại sao những người Scala đi cho nhiều artifact overkill :-) thay thế?Tại sao scala maven hiện vật có một tạo tác cho mỗi phiên bản scala thay vì một classifier cho mỗi phiên bản scala?

+0

Có lẽ nó liên quan đến thực tế là các tệp nhị phân Scala không tương thích giữa các phiên bản chính và không được trộn lẫn. – Jakozaur

+1

Nó vượt xa "không nên!" Nói chung, bạn sẽ nhận được một ngoại lệ khi bạn cố gắng tải một lớp được tạo ra bởi một phiên bản không tương thích của trình biên dịch. Nó cũng có thể là một lỗi khá phức tạp - không có gì đơn giản như một "phiên bản Scala mis-match, hãy tìm phiên bản của lớp từ phiên bản tương thích của trình biên dịch Scala" –

Trả lời

4

Tôi có thể sai, nhưng nếu mục đích của phân loại là "phân biệt hiện vật được xây dựng từ POM tương tự nhưng khác nhau về nội dung của họ", sau đó tôi nhìn thấy một lý do rất tốt không để sử dụng chúng cho phiên bản scala: các phiên bản scala không chỉ là nhị phân không tương thích, chúng có thể rất tốt nguồn không tương thích. Ví dụ: khi nâng cấp scala từ 2,7 lên 2,8, tôi phải thực hiện một số thay đổi quan trọng đối với cơ sở mã. Nếu tôi muốn giữ cả phiên bản scala 2.7 và 2.8 cùng một lúc, tôi sẽ cần phải tạo một nhánh song song, và cả hai nhánh chắc chắn sẽ không có cùng mã nguồn.

Khi tôi đọc "từ cùng một POM", tôi hiểu rằng nó có nghĩa là từ cùng một mã nguồn quá, mà rõ ràng không phải là trường hợp với hai chi nhánh mã.

Lý do quan trọng khác là một trình phân loại về bản chất là một chuỗi đơn, đã được sử dụng cho nhiều thứ. Nhiều phân loại chuẩn hoặc ít hơn bao gồm "nguồn", "javadoc" hoặc "tài nguyên". Ý nghĩa của các phân loại này giống nhau trong dự án scala, và hoàn toàn trực giao với phiên bản scala, như tôi sẽ cố gắng hiển thị.

Tài liệu của Maven đề xuất sử dụng các trình phân loại như "jdk15" hoặc "jdk14" để biểu thị phiên bản của jvm mà tạo phẩm nhị phân được biên dịch. Cho rằng mã java là tương thích ngược, về nguyên tắc các tạo phẩm có cả hai trình phân loại ("jdk15" hoặc "jdk14") được biên dịch từ cùng một mã nguồn. Đây là lý do tại sao bạn không cần phải sao chép phân loại cho tạo phẩm "nguồn" hoặc nói cách khác, bạn không cần phải có trình phân loại có tên "sources-jdk14" và "sources-jdk15". Nhưng bạn không thể áp dụng cùng một lý do cho phiên bản scala: bạn có thể cần mã nguồn khác cho dù bạn biên dịch với scala 2.7 hoặc scala 2.8, bạn thực sự cần hai tạo phẩm khác nhau với các trình phân loại như "sources-scala2.7" hoặc "source-scala2.8". Vì vậy, chúng tôi đã có các bộ phân loại tổng hợp. Đối với các tạo phẩm nhị phân, bạn cũng không chỉ cần phân biệt giữa phiên bản jvm đích (nhớ, bạn có thể biên dịch mã scala của bạn để nhắm vào các phiên bản jvm khác nhau) mà còn là phiên bản scala được biên dịch. Vì vậy, bạn sẽ kết thúc với một cái gì đó như "jdk14-scala2.7" hoặc "jdk14-scala2.8" hoặc "jdk15-scala2.7" hoặc "jdk15-scala2.8". Tuy nhiên, một bộ phân loại hỗn hợp khác. Vì vậy, tin nhắn mang về nhà là phiên bản scala thực sự là một cách riêng biệt của phân loại các tạo phẩm, đó là hoàn toàn chính thức cho tất cả các phân loại hiện có. Có, chúng ta thực sự có thể sử dụng các bộ phân loại tổng hợp như trên (chẳng hạn như "sources-scala2.7"), nhưng sau đó chúng ta sẽ không sử dụng các bộ phân loại chuẩn, điều này gây nhầm lẫn, nhưng cũng cần phải sửa đổi tất cả các công cụ xung quanh các bộ phân loại : nếu tôi sử dụng công cụ xây dựng không có kiến ​​thức về scala (chỉ java) nhưng biết cách tự động xuất bản tạo phẩm "nguồn"? Tôi có cần sửa đổi công cụ xây dựng này để anh ấy biết xuất bản một tạo phẩm "nguồn-scala2.7" thay thế không? Mặt khác, nếu tôi mã hóa phiên bản scala trong tên tạo tác (cơ sở) và đưa nó cho công cụ xây dựng, mọi thứ hoạt động như bình thường và tôi nhận được một tạo phẩm với trình phân loại "nguồn".

Tất cả trong tất cả và trái với trực giác ngay lập tức, mã hóa phiên bản scala trong tên cho phép tích hợp tốt hơn trong hệ sinh thái xây dựng java hiện có.

+0

Đúng, sự không tương thích nguồn là một điểm tốt mà tôi không nghĩ đến. Nó vẫn làm cho tôi tự hỏi tại sao họ thậm chí tạo ra hiện vật cho một số ứng cử viên phát hành của cùng một bản phát hành, như trong scalatest, mặc dù. –

+0

Như tên gọi của chúng, các ứng cử viên phát hành chỉ là ứng cử viên cho một bản phát hành ổn định, nói cách khác chúng là các bản xem trước juste. Như vậy, họ có mọi quyền hoàn toàn phá vỡ khả năng tương thích với các ứng cử viên phát hành trước đó, và do đó yêu cầu một phiên bản riêng biệt (miễn là các vấn đề chính được tìm thấy với một ứng cử viên phát hành nhất định, họ chỉ tiếp tục sửa nó - có khả năng phá vỡ khả năng tương thích với các ứng cử viên phát hành trước đó - cho đến khi chất lượng được coi là đủ cho một bản phát hành chính thức). –

2

Scala cung cấp khả năng tương thích giữa phiên bản đầu ra bytecode (.class tệp) chỉ trên các bản phát hành bản vá (thành phần thứ ba của thông số phiên bản Major.Minor.Patch).

Maven không có chỗ để mã hóa chính xác đây là thuộc tính hạng nhất của tạo tác, do đó nó phải được mã hóa theo quy ước trong tên.

Đáng buồn thay ...

+0

Ai đó có thể sửa tôi, nhưng tôi nghĩ đó là những gì mà Maven classfiers Là cho. Từ http://maven.apache.org/pom.html -> "Trình phân loại cho phép 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ới nội dung của chúng. Nó là một chuỗi tùy chọn và tùy ý - nếu có - được nối thêm cho tên tác phẩm ngay sau số phiên bản. " Tôi sử dụng các trình phân loại phiên bản cho các dự án Scala do Maven xây dựng như dự án tại https://github.com/hohonuuli/scilube – hohonuuli

+0

Ivy 2 có chúng không? Toàn bộ thế giới là Terra Incognita với tôi ... –

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