2009-09-21 29 views
23

Giả sử, một nhóm lập trình viên đang thực hiện một ứng dụng web trong Perl và sử dụng git để lưu trữ mã của họ. Bây giờ họ có một vấn đề nhỏ với versioning module của họ:

  • Perl::CriticPBP cả đề nghị một RCS hậu thuẫn $VERSION biến trong mã
  • git khuyến cáo một cách rõ ràng chống sử dụng số sửa đổi có thể thay thế trong mã (với lập luận tốt)

Tôi hiểu tại sao git không làm mở rộng từ khóa. Tuy nhiên, tôi hoàn toàn có thể hiểu được sự cần thiết của số sửa đổi cho một chút mã:

  • Bạn làm cần một phiên bản riêng biệt cho mỗi mô-đun, vì bạn có thể muốn sử dụng phiên bản use
  • Bạn có thể don 't muốn thay đổi những con số phiên bản dành cho nhanh chóng thay đổi mô-đun bằng tay

Một phiên bản sản phẩm toàn cầu để đóng gói và thử nghiệm có thể dễ dàng thực hiện với các thẻ và git describe, nhưng tôi vẫn không thấy một cách để giới thiệu phiên bản tự động cho các mô-đun đơn lẻ.

Bạn có giải pháp nào cho tôi không?

+0

Đây là một câu hỏi hay. Nhưng làm Perl :: Critic và/hoặc PBP thực sự đề nghị số phiên bản RCS-backed? AFAI, họ thực sự không quan tâm đến những con số đó đến từ đâu. – innaM

+1

@Manni: vâng, họ không quan tâm, nhưng vẫn khuyên RCS là "thực hành tốt nhất": "Thực tiễn phổ biến là sử dụng từ khóa $ Revision: 3629 $ để tự động xác định biến $ VERSION như sau: ($ VERSION) = '$ Sửa đổi: 3629 $' = ~ m {\ $ Bản sửa đổi: \ s + (\ S +)} x; " –

+0

Tôi thông cảm vì tôi hiện đang ở trong tình trạng tương tự. Tôi đoán là với ngày càng nhiều dự án sử dụng git, thực hành sẽ trở nên ít phổ biến hơn. – innaM

Trả lời

20

Hãy quên đi những gì Perl Best Practices nói. Nó không phải là kinh thánh, và nó chỉ đơn thuần gợi ý sử dụng từ khóa RCS bởi vì tại thời điểm nó được viết không ai nghĩ về các hệ thống kiểm soát nguồn khác. Mục tiêu của bạn sẽ không bao giờ tuân thủ việc triển khai cụ thể của PBP, nhưng hãy điều chỉnh ý tưởng trong PBP về tình hình của riêng bạn. Hãy nhớ đọc chương đầu tiên của cuốn sách đó.

Trước tiên, hãy sửa chữa những giả định của bạn:

  1. Bạn không cần một phiên bản riêng biệt cho mỗi mô-đun trong một phân phối. Bạn chỉ cần cung cấp cho mỗi tệp mô-đun một phiên bản khác với phiên bản trước đó. Mỗi mô-đun trong bản phân phối có thể có cùng một phiên bản và khi chúng thực hiện, tất cả chúng có thể vẫn lớn hơn phiên bản từ bản phân phối cuối cùng.

  2. Tại sao không thay đổi phiên bản của mô-đun thay đổi nhanh theo cách thủ công?Bạn nên xác định các điểm nơi mã của bạn trở thành thứ mà mọi người có thể sử dụng. Tại những điểm đó, bạn làm điều gì đó để nói rằng bạn đã đưa ra quyết định rằng sản phẩm công việc của bạn nên được phân phối, cho dù là bản thử nghiệm hay bản phát hành ổn định. Bạn thay đổi các phiên bản như một cách để nói cho mọi người biết về sự phát triển của bạn. Khi bạn để hệ thống kiểm soát nguồn làm điều đó chỉ vì bạn cam kết, bạn sẽ mất cơ hội biểu thị các chu kỳ trong sự phát triển của mình. Ví dụ, tôi thường sử dụng hai bản phát hành vị trí nhỏ. Điều đó có nghĩa là tôi nhận được 100 bản phát hành trước khi cuộc đối đầu hết hạn và tôi cần phải nhấn mạnh phiên bản chính để khôi phục thứ tự sắp xếp hợp lý. Đó là không đủ không gian phiên bản nếu tôi để VCS xử lý việc này cho tôi.

Tôi đã từng sử dụng từ khóa RCS để liên kết các phiên bản của mô-đun với số đăng ký hoặc sửa đổi của họ, nhưng tôi chưa bao giờ thực sự thích điều đó. Tôi thực hiện nhiều cam kết cho một tập tin trước khi nó đã sẵn sàng để trở thành phiên bản tiếp theo, và tôi không cần $VERSION thay đổi chỉ vì tôi đã sửa lỗi đánh máy tài liệu. Sẽ có những bước nhảy lớn trong số phiên bản vì tôi đã thực hiện rất nhiều thay đổi nhỏ.

Bây giờ tôi chỉ thay đổi phiên bản của tất cả các tệp mô-đun của mình khi tôi sẵn sàng phát hành bản phân phối mới. Tôi sử dụng ppi_version thay đổi tất cả các phiên bản cùng một lúc:

ppi_version change 1.23 1.24 

Tất cả các tập tin mô-đun của tôi nhận được cùng một $VERSION. Tôi không cần sử dụng $VERSION để phân biệt chúng vì tôi sử dụng các tính năng kiểm soát nguồn thông thường để thực hiện điều đó. Tôi không cần $VERSION để liên kết với cam kết cụ thể.

Nếu tôi đang làm việc hướng tới bản phân phối mới từ phiên bản 1.23, tôi bắt đầu tạo phiên bản phát triển 1.23_01, 1.23_02, v.v, nhưng chỉ khi tôi sẵn sàng để mọi người thử các phiên bản đó. Tôi thay đổi phiên bản ở đầu chu kỳ, chứ không phải kết thúc. Tất cả các cam kết của tôi dẫn đến bản phát hành tiếp theo đã có phiên bản tiếp theo của họ. Tôi cũng ghi chép về những gì tôi muốn chu kỳ đó hoàn thành.

Khi tôi nghĩ rằng đó là khởi đầu của một chu kỳ mới, tôi gặp lại phiên bản. Khi tôi nghĩ rằng tôi có bản phát hành ổn định, tôi thay đổi phát triển $VERSION thành bản ổn định, như 1.23_04 đến 1.24. Bất cứ khi nào tôi phát hành một cái gì đó, tôi cũng gắn thẻ trong điều khiển nguồn. Tôi có thể thấy các điểm phát triển chính của tôi ở đâu với sự kiểm soát nguồn khá dễ dàng.

Mọi thứ đều dễ dàng hơn theo cách này đối với tôi. Không có gì liên quan đến kiểm soát nguồn mà tôi quyết định sử dụng, vì vậy tôi không phải làm lại mọi thứ nếu tôi thay đổi những gì tôi sử dụng.

+1

Chỉ cần làm rõ: trong nhóm của tôi, tôi chủ yếu là người khóc "F ** k PBP!" ;-) Tôi muốn tìm hiểu xem liệu có phương pháp nào tốt hơn những gì tôi định làm. ppi_version chỉ là một mẹo mà tôi hy vọng, vì vậy cảm ơn bạn rất nhiều! –

+0

Cảm ơn bạn đã tip về ppi_version! http://search.cpan.org/dist/PPI-PowerToys/lib/PPI/PowerToys.pm –

3

Tôi muốn thực hiện các phiên bản theo cách thủ công khi giới thiệu các thay đổi không tương thích, bởi vì, chắc chắn không phải mọi thay đổi đều biện minh cho dấu vết.

Bạn cũng có thể muốn kiểm tra 'gitattributes' manpage cho thuộc tính filter - có lẽ bạn sẽ muốn giới thiệu bộ lọc của riêng bạn để thực hiện các thay thế dựa trên 'git describe' xuất tự động.

+1

Bạn có chắc chắn rằng một bộ lọc sẽ giúp ích trong trường hợp đó? git không có anyhing như số sửa đổi. Vì vậy, một bộ lọc sẽ làm gì khi bạn yêu cầu nó chèn một số phiên bản ở đâu đó? – innaM

+2

Manni, bộ lọc sẽ triển khai phiên bản dựa trên thẻ và đầu ra 'git description'. –

+2

Về cơ bản, đầu ra 'git describe', rất hay khi dựa trên thẻ. –

0

Làm thế nào về một cái gì đó thực sự lười biếng mà chỉ là một chút lộn xộn:

Bạn có thể viết một wrapper nhỏ cho git-add. Trước khi thực sự gọi git-add trình bao bọc sẽ di chuyển một số phiên bản ở đâu đó trong mô-đun, nơi nó có thể được tìm thấy với một regex đơn giản.

Cập nhật:

Tôi hiện không tự mình sử dụng một cái gì đó như thế, nhưng tôi đang suy nghĩ nghiêm túc về điều đó.

lý hiện tại của tôi:

  • Không giống như CVS hoặc lật đổ, git không biết bất cứ điều gì về phiên bản hoặc sửa đổi số.
  • Trình điều khiển bộ lọc sẽ cần phải có một nguồn thông tin khác nhau để có thể chèn số phiên bản và nguồn này cần phải có sẵn trên máy của bất kỳ nhà phát triển nào có liên quan.
  • Do đó, nguồn tốt nhất cho số phiên bản là chính tệp đã được phiên bản.
  • Và để bản thân tệp có thể sử dụng được làm nguồn cho số phiên bản tiếp theo, số phiên bản cần phải là một phần của git blob tương ứng.

Lợi ích:

  • Đây là như tự động như nó được, không có cách nào để quên cập nhật số phiên bản của bạn.
  • Chuyển tiếp trơn tru từ CVS/SVN sang git. Mọi cam kết đều giới thiệu một phiên bản mới.

Nhược điểm:

  • Nhà phát triển lười biếng người luôn luôn làm git add . sẽ di chuyển số phiên bản của file anh không chạm vào.
  • Dường như không có cách nào để thực thi việc sử dụng tập lệnh trình bao bọc.
+0

Không cần trình bao bọc - đây là trình điều khiển bộ lọc làm gì. –

+0

No. Đó hoàn toàn không phải là những gì họ làm. Một trình điều khiển lọc sẽ smudge một tập tin khi thanh toán và làm sạch nó khi thêm. Những gì tôi đề xuất là một số phiên bản thực sự làm cho nó vào blob và do đó danh sách sửa đổi. – innaM

+1

Đó là, thực sự, không phải là mục đích của bộ lọc, nhưng 'pre-commit' hook có thể làm tốt hơn so với wrapper xung quanh' add'. –

3

Bạn làm gì để xây dựng mô-đun Perl của mình?

Các giải pháp được sử dụng bởi Linux kernel và bởi dự án Git chính nó là để thay thế "++ VERSION ++" (hoặc "++ PROJECT_VERSION ++", hoặc "@@ PROJECT_VERSION @@") placeholdersbằng cách xây dựng hệ thống, trong trường hợp đó bởi Makefile. (Trong các tệp trong C, nó được thực hiện bằng cách xác định hằng số tiền xử lý "PROJECT_VERSION", thông qua tùy chọn '-DPROJECT_VERSION=$(PROJECT_VERSION)' được chuyển đến trình biên dịch). Trong trường hợp của bạn có thể là một cái gì đó như Module::Install, Module::Build hoặc ExtUtils::MakeMaker.

Cả Git ans Linux kernel sử dụng cho rằng GIT-VERSION-GEN kịch bản đó:

  1. sử dụng git describe nếu dự án được xây dựng từ bên trong kho git,
  2. rơi trở lại trên version (hoặc VERSION, hoặc GIT-VERSION-FILE) nộp nếu xây dựng được thực hiện từ ảnh chụp nhanh (tệp này được tạo khi tạo ảnh chụp/lưu trữ),
  3. và cuối cùng là số phiên bản được xác định trước, số được cập nhật trong cam kết đánh dấu phiên bản mới phát hành (ví dụ: cb572206 cam kết trong kho git, còn gọi là cam kết v1.6.4.4).

Tôi hy vọng điều đó sẽ giúp ích cho bạn.

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