2012-07-20 14 views
14

Trước hết, xây dựng gia tăng qua SBT là khá tuyệt vời, thường trong phạm vi 1sec <. Tuy nhiên, đôi khi bạn phải làm sạch/biên dịch hoàn toàn, hoặc trong trường hợp xây dựng gia tăng, bạn thực hiện thay đổi thành một tệp sau đó kích hoạt việc biên soạn hàng tá tệp khác.Xây dựng chậm Scala: các phương pháp phát triển để tránh

Đây là thời điểm phát triển Scala trở nên ít ... vui vẻ, như suy thoái dẫn đến luồng công việc có thể khuyến khích bối cảnh chuyển đổi (kiểm tra thư điện tử, tất cả Bài Stackoverflow, vv), mà tinh tế làm cho con người kém năng suất

Vì vậy, , các cách tiếp cận phát triển cần tránh để cải thiện các bản dựng/biên dịch hoàn toàn là gì, và (lý tưởng), thay đổi-một-tập-mà-không-biên dịch lại-nửa-các ứng dụng xây dựng gia tăng?

Ví dụ tôi có thể nghĩ đến:
1) có tốt hơn khi có một tệp hàng nghìn nghìn dòng do-it-all hoặc một vài tệp được chia nhỏ không?
2) Tôi có thể có bánh (hoa văn) của tôi hoặc sẽ làm tăng thời gian xây dựng?
3) tôi có thể có mô hình thư viện pimp'd x, y, z hoặc tốt hơn để tìm một cách khác không?
4) là các đối tượng gói (với implicits) một kẻ giết thời gian xây dựng?
5) Các đối tượng lồng nhau và các đặc điểm?
6) phương pháp/thông số tiềm ẩn hoặc ngừng thông minh và rõ ràng?

Cụ thể, tôi đang nghĩ đến việc bỏ rơi một mẫu bánh DAO Tôi đã đưa ra và hợp nhất vào trường hợp ScalaQuery + đối tượng đồng hành + đặc điểm nhà cung cấp cơ sở dữ liệu tối thiểu. Điều đó một mình sẽ đổ 20 tập tin scala.

Ứng dụng đủ nhỏ (120 scala + 10 tệp java) để cấu trúc lại ngay bây giờ mà không gặp rắc rối quá nhiều. Rõ ràng là một ứng dụng scala phát triển, do đó cũng sẽ xây dựng thời gian, chỉ dựa trên LOC một mình. Tôi chỉ cố gắng để xem nơi để cắt giảm chất béo và nơi không bận tâm (tức là giữ mọi thứ như họ đang có) để ứng dụng hiện tại và tương lai được hưởng lợi từ sự biểu cảm mà scala dành mà không cần tăng thời gian xây dựng.

Cảm ơn một số ví dụ về trải nghiệm của bạn về những điều tốt đẹp, xấu, và xấu xí của sự phát triển của scala trong một thời gian dựng hình.

+3

Thực ra, tôi tự hỏi tại sao bạn cần 'làm sạch' để thường làm phiền bạn? Có điều gì đó không ổn? Theo kinh nghiệm của tôi, 'sạch sẽ' rất hiếm khi cần thiết. Một trong những trường hợp là nếu bạn làm việc với một phụ thuộc snapshot và bạn cần phải cập nhật điều đó. Trong những trường hợp đó, tôi tìm thấy 'rm -r lib_managed/jars' và biên dịch tiếp theo nhanh hơn. –

+0

Đó là sự thật, sạch sẽ không thường xuyên yêu cầu, nhưng nhu cầu phát sinh (tham nhũng/thiếu lớp tập tin và các đối tượng gói, thủ phạm chính đối với tôi) và tất nhiên triển khai đòi hỏi một sạch/biên dịch, có thể ne một rắc rối khi, ooops , bỏ lỡ lỗi đánh máy đó, phải dọn dẹp/biên dịch lại. Điều này thậm chí không bao gồm các phiên bản gia tăng mà một thay đổi mã duy nhất có thể, thay vì biên dịch lại tệp đã thay đổi, xếp thành hàng chục tệp (kiểu tự, mẫu bánh, v.v.), trong ứng dụng nhỏ của tôi quay <1 thứ hai thành> 10 giây, một sự khác biệt rất lớn. – virtualeyes

Trả lời

2

Hãy xem how incremental recompilation works in SBT.

Đó là loại như thế này:

  1. Tìm tất cả các lớp học mà API hiển thị công khai đã thay đổi
  2. vô hiệu hóa tất cả những người phụ thuộc của nó, người phụ thuộc người phụ thuộc của nó, và vân vân.

Với mục đích của SBT, "phụ thuộc" là cả người dùng của lớp và một lớp được xác định trong cùng một tệp.

dụ của Owen cho foo.scala thậm chí có thể điều này, và bạn sẽ thấy vấn đề này:

object foo { 
    def z: Int = 8 
} 

object foo2 { 
    class A { ... } 
} 

Thực hành tốt:

  • riêng file cho các lớp riêng biệt
  • Fine-grained giao diện
  • Sử dụng cùng mức độ trừu tượng trong các đối tượng đồng hành như trong các lớp bạn đồng hành của chúng; nếu đối tượng đồng hành tiếp cận thông qua các lớp trừu tượng, hãy kéo nó vào một lớp và tệp riêng biệt.
+0

+1, cảm ơn, kỳ quặc đủ, tôi tái cấu trúc vào cuối tuần và vết thương lên, ví dụ như trường hợp mô hình lớp + đối tượng mapper đồng hành + đặc điểm DAO và lớp thực hiện tất cả trong MỘT tệp. Tại sao bạn không trả lời sớm hơn? ;-) Tôi cần phải khởi động dự án đã được tái cấu trúc để thấy sự khác biệt về thời gian xây dựng, nhưng tôi thấy rất nhiều: (biên dịch 71 Scala và 8 tệp Java) trên một thay đổi duy nhất cho tệp lớp Foo/dao lớp, đó là để nói, slooooooow. Điều này có thể đã được các trường hợp pre-refactor nhưng cần phải xác minh .. – virtualeyes

+0

thiết lập logLevel trong toàn cầu: = Level.Debug là bạn của bạn - nó cho thấy các tập tin chính xác bị vô hiệu hóa ở mỗi giai đoạn của fan hâm mộ mất hiệu lực. Nếu bạn thấy một tệp cấp cao làm mất hiệu lực một loạt các tệp cấp thấp, hãy đào sâu vào, nó có thể được làm lại để tránh điều đó. – cldellow

+0

cảm ơn, không cung cấp bất kỳ manh mối nào. Bắt, "Nguồn gián tiếp bị vô hiệu bởi:" và sau đó rỗng tham chiếu Set(); về lý do tại sao trình biên dịch xay đi trên 68 tệp scala và 4 tệp java trên Foo DAO thay đổi trong quá trình xây dựng gia tăng, tôi không biết, nhưng thực sự muốn xem điều gì đang xảy ra dưới mui xe (tức là chính xác tệp nào đang được biên dịch) – virtualeyes

3

Tôi đã nhận thấy rằng các thành viên loại có thể buộc xây dựng lại ở những nơi bạn không mong đợi. Ví dụ:

foo.scala:

object foo { 
    class A { 
     type F = Float 
    } 
    def z: Int = 8 
} 

bar.scala:

object bar { 
    def run { println(foo.z) } 
} 

Thay đổi giá trị của z không buộc bar được biên dịch lại. Thay đổi loại F, mặc dù bar không bao giờ đề cập đến F hoặc thậm chí đến A. Tại sao, tôi không có ý tưởng (Scala 2.9.1).

+0

+1, ví dụ cụ thể, Owen. – virtualeyes

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