2008-12-12 22 views
9

Tôi muốn có số sửa đổi mã nguồn cho mã nguồn của Delphi và phiên bản exe. Cách tốt nhất để làm điều này tự động là gì?Làm thế nào để bao gồm số sửa đổi Subversion vào dự án Delphi

Tôi muốn hiển thị số bản sửa đổi trong màn hình "Giới thiệu" và trong thông tin phiên bản của dự án.

Tôi hiện đang sử dụng IDE Delphi (2006/2007) và Tortoise SVN.

Trả lời

9

Tôi đồng ý với nhận xét về $ Revision $ không phải là công cụ phù hợp cho công việc. Sử dụng công cụ để trích xuất số sửa đổi từ đầu ra của svnthông tin thực sự là điều đúng để thực hiện.Tuy nhiên

Có thêm hai điều cần lưu ý:

  1. svnthông tin sẽ chỉ trả lại các thông tin chính xác nếu svncập nhật đã được chạy trên thư mục với các nguồn kiểm tra ra . Nếu bạn sử dụng các bước xây dựng tùy chỉnh, bạn có lẽ cũng nên thêm một lệnh cho nó.

  2. svnthông tin cũng cung cấp cho bạn thông tin về đường dẫn lưu trữ. Đây là cách duy nhất để phân biệt các nguồn trong số thân cây và một nơi khác, như trong các thẻ . Nếu bạn muốn hộp Giới thiệu của bạn chứa một chuỗi để xác định chính xác các nguồn được sử dụng để xây dựng ứng dụng, hãy đảm bảo rằng đường dẫn kho lưu trữ có sẵn.

Edit:

Đây là một kịch bản lệnh cần được sao chép vào thư mục cấp cao nhất của dự án. Nó sẽ cập nhật các nguồn từ kho, nhận số sửa đổi SVN từ số thông tin svn và so sánh nó với SVN_REVISION không đổi từ tệp src \ SvnRev.inc. Nếu tập tin bị thiếu nó sẽ tạo ra nó, nếu sửa đổi là khác nhau nó sẽ ghi đè lên nó. Nếu svn không khả dụng, nó sẽ ghi số sửa đổi 0 vào tệp.

Tệp kết quả src \ SvnRev.inc có thể đơn giản được đưa vào tệp nguồn. Một tệp tương tự có thể được tạo để được bao gồm trong tài nguyên phiên bản.

@echo off 

setlocal 
rem determine project top level directory from command file name 
set PRJDIR=%~dp0 
cd %PRJDIR% 

set SVNREVFILE=src\SvnRev.inc 

rem execute "svn info", extract "Revision: 1234" line, and take SVN rev from there 
svn update 
for /F " usebackq tokens=1,2 delims=: " %%i in (`svn info`) do set key=%%i&set value=%%j&call :read-svn-rev 
@echo SVN revision "%SVNREV%" 

rem extract "const SVN_REVISION = 1234;" line, and take header SVN rev from there 
for /F " usebackq tokens=2,4 " %%i in (%SVNREVFILE%) do set name=%%i&set value=%%j&call :read-file-rev 
@echo Include file revision "%FILEREV%" 

rem check for valid SVN rev 
if "%SVNREV%" EQU "" goto :no-svn-ref 
rem do not write file if SVN ref is equal 
if "%FILEREV%" EQU "%SVNREV%" goto :EOF 

@echo Writing svn revision %SVNREV% to %SVNREVFILE% 
@echo const SVN_REVISION = %SVNREV% ; > %SVNREVFILE% 
goto :EOF 

:no-svn-ref 
if not exist %SVNREVFILE% goto :no-header-file 
rem do not write file if SVN ref is already unset 
if "%FILEREV%" EQU "0" goto :EOF 
@echo Writing svn revision 0 to %SVNREVFILE% 
goto :write-no-version 

:no-header-file 
@echo Creating %SVNREVFILE% with svn revision 0 
:write-no-version 
@echo const SVN_REVISION = 0 ; > %SVNREVFILE% 
goto :EOF 

endlocal 
goto :EOF 

:read-svn-rev 
if "%key%" EQU "Revision" set SVNREV=%value%& 
goto :EOF 

:read-file-rev 
if "%name%" EQU "SVN_REVISION" set FILEREV=%value%& 
goto :EOF 
+0

Tôi thấy điều này không hoạt động đúng cách. Tôi nghĩ lý do có lẽ là vì bản sao làm việc của tôi luôn chứa cấu trúc dự án hoàn chỉnh của tôi, bao gồm cả các thẻ và các nhánh. Do đó, tập lệnh sẽ lấy số sửa đổi của thay đổi cuối cùng trên toàn cầu thay vì chỉ thư mục mà nó được thực thi. SubWCRev.exe mặt khác hoạt động hoàn hảo với kịch bản sử dụng của tôi. –

+0

@Timo: Chắc chắn nó hoạt động đúng cách, mặc dù nó có thể không làm những gì bạn mong đợi nó làm. Kịch bản này trả về bản sửa đổi toàn cầu, đó là bản sửa đổi mà OP yêu cầu. Tôi không bao giờ tuyên bố điều này để trả lại bản sửa đổi cam kết cuối cùng, tất nhiên là khác nhau. Cảm ơn bạn đã bỏ phiếu xuống. – mghie

+0

@mghie: Sau khi đọc lại câu trả lời của bạn, tôi thừa nhận, có bạn nói đúng. Bạn không bao giờ tuyên bố rằng nó sẽ trả lại bản sửa đổi cam kết cuối cùng trên bản sao làm việc hiện tại. Vì vậy tôi đã bỏ phiếu bầu của tôi xuống. Nó vẫn không phải là giải pháp phù hợp với tôi nhưng tôi chắc rằng những người khác tìm thấy câu trả lời này hữu ích. –

1

Đề xuất: sửa đổi tập lệnh xây dựng của bạn để thay đổi một số tệp phiên bản được biên dịch sau đó. Rất khó để đề xuất bất cứ điều gì cụ thể hơn mà không biết môi trường xây dựng bạn đang sử dụng.

13

Có một chương trình có tên SubWCRev.exe đi kèm với TortoiseSVN sẽ thay thế mã thông báo cho bạn. Vì vậy, một nơi nào đó trong nguồn của bạn, bạn chèn mã thông báo, và truyền tên tệp đầu vào và đầu ra cho SubWCRev.exe, và nó sẽ thay thế mã thông báo bằng nhiều thông tin SVN khác nhau, ví dụ: số sửa đổi. Lưu ý, đây là một chương trình độc lập mà bạn có thể sử dụng với kịch bản xây dựng của mình, bạn không cần sử dụng TortoiseSVN cùng với nó.

+0

Đó là cách tôi sử dụng. Chúng tôi đã sử dụng tập lệnh ở trên trước đây nhưng hôm nay chúng tôi đã tạo thẻ phát hành và tập lệnh bao gồm số phiên bản sai vào bản dựng vì các lý do được giải thích ở trên. Lỗi của tôi. Chúng tôi đã chuyển sang sử dụng SubWCRev.exe ngay bây giờ. –

1

Nếu bạn sử dụng svn:keywords và bao gồm $Revision$ trong tệp của mình, tệp này sẽ được cập nhật mỗi lần tệp được cam kết.

Vì vậy, hãy lưu ý rằng trong tệp version ở cấp cao nhất của dự án, bạn thay đổi/cam kết trên mọi bản dựng và đọc phần đó để tải phiên bản.

+0

Âm thanh tuyệt vời ngoại trừ tôi muốn nhận được "bản sửa đổi toàn cầu", được thảo luận trong tài liệu. – Harriv

+0

Điều này sẽ không hoạt động trừ khi có một số cách tự động để thay đổi tệp đó, nếu không nó sẽ không được cam kết và số sửa đổi sẽ không thay đổi. Và ngay cả như vậy nó là một hack tốt nhất, bởi vì bạn nhận được rất nhiều thay đổi SVN không cần thiết và sự khác biệt của sự khác biệt. – mghie

5

Trong nhận xét bạn đề cập đến bạn muốn sửa đổi toàn cầu, chứ không phải bản sửa đổi của bất kỳ tệp cụ thể nào. Bạn sẽ không nhận được con số đó trong một từ khóa vì con số này không liên quan đến bất kỳ một tệp nào, nhưng thay vào đó bất kỳ tệp nào đã được kiểm tra gần đây nhất ở bất kỳ đâu trong cây.

Bạn có thể tạo tập lệnh hoặc chương trình nhỏ chạy svn info và sau đó phân tích cú pháp đầu ra để lấy số sửa đổi bạn đang theo dõi. Bạn có thể sử dụng số đó cùng với mẫu của tệp RC để chèn số bản sửa đổi vào bản ghi thông tin phiên bản. Tệp được tạo này sẽ không được đăng ký. Chạy tập lệnh như một phần của thủ tục MSBuild của bạn.

Đối với các phiên bản trước MSBuild Delphi, hãy tạo nhóm dự án và sau đó tạo kịch bản lệnh cho dự án đầu tiên trong nhóm. "Xây dựng tất cả" hoặc "Biên dịch tất cả" sẽ chạy tập lệnh trước khi biên dịch dự án chính.

Bạn cũng có thể có mã trong phần initialization của mỗi đơn vị để thêm sửa đổi của nó (như nhận được bởi câu trả lời của Ieure) vào danh sách chung. Sau đó chọn số cao nhất trong danh sách tại thời gian chạy. Điều đó có thể giúp bạn hiển thị số trong hộp "about", nhưng bạn không thể sử dụng nó trong thông tin phiên bản của chương trình.

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