2009-09-13 45 views
14

Tôi muốn có một biến (hoặc #define) trong nguồn C++ sẽ tăng mỗi lần tôi sử dụng Trình tạo Qt để tạo mã nguồn. Có cách nào tôi có thể làm điều này, có lẽ một số plugin Qt Creator hoặc tương tự? Nếu có một cách để làm điều đó nếu tôi sử dụng "làm" trên dòng lệnh để xây dựng?Tự động tăng số bản dựng trong Qt Creator

Trả lời

16

Trong tệp .pro, bạn có thể tạo biến có chứa kết quả của chương trình dòng lệnh. Sau đó, bạn có thể sử dụng điều đó để tạo một định nghĩa.

BUILDNO = $$(command_to_get_the_build_number) 
DEFINES += BUILD=$${BUILDNO} 

Nếu bạn chỉ muốn một số incrementing đơn giản, bạn có thể sử dụng một kịch bản khá đơn giản:

#!/bin/bash 
number=`cat build_number` 
let number += 1 
echo "$number" | tee build_number #<-- output and save the number back to file 

tôi nên lưu ý rằng điều này sẽ gây ra số lượng xây dựng để tăng mỗi khi bạn xây dựng, và cũng có thể tăng nếu bạn cố gắng xây dựng nhưng nó không thành công. Một cách tốt hơn là để có được một số xây dựng dựa trên tình trạng của mã, và nhiều công cụ kiểm soát phiên bản có thể giúp bạn có được một chuỗi văn bản cho điều đó, nếu không phải là một số.

+1

Tôi thực sự muốn tăng trên mỗi bản dựng không phải từng cam kết kho lưu trữ. Điều này trả lời câu hỏi của tôi. – Ross

+0

Tôi đang sử dụng sơ đồ của riêng mình với Qt + QMake: http://indiocolifax86.wordpress.com/2010/05/22/a-scheme-for-automatic-build-numbers-in-cc-projects/ –

+2

phiên bản .bat sexy :) @echo off set/p var = ver.txt (chỉ cần tạo ver.txt với 0 trong số đó) – argh

4

Đề xuất của Caleb rất tuyệt, nhưng không hoạt động "ngoài hộp" trong trường hợp của tôi. Tôi có một số lỗi thay vào đó và phải mất một số đọc để sửa chữa chúng. Những thay đổi rất nhỏ. Tôi đã sử dụng Qt 4.7 trên Ubuntu Linux ... Thay đổi đầu tiên, nếu bạn có thể tin rằng, có trong kịch bản lệnh shell để chuyển từ let number += 1 sang let number++ ... Tôi thường sử dụng/lập trình Windoze, vì vậy tôi không thể giải thích điều đó, nhưng khi tôi chạy tập lệnh từ dòng lệnh (dấu nhắc trình bao) trong trường hợp ban đầu, tôi nhận được thông báo lỗi, trong trường hợp đã thay đổi, tất cả đều tốt và số tăng dần được trả về ...

Vì nó không được báo cáo hoàn toàn bởi Caleb - Tôi đã sử dụng build_number.sh làm tên của tập lệnh shell và tạo một tệp khác có tên build_number (không có .sh) và chỉ đặt một số không bên trong, không có gì khác.

Lỗi cuối cùng và đáng ghét nhất đã được sửa bằng cách thay thế BUILDNO = $$(command_to_get_the_build_number) bằng BUILDNO = $$system(./build_number.sh) trong tệp dự án Qt. Lưu ý số system sau $$ và yêu cầu ./ ở phía trước tên tệp. Sau này là tiểu học cho người dùng Linux thông thường, nhưng không nhiều như vậy đối với người dùng Windows.

Hy vọng điều này sẽ làm cho nó trở nên thẳng thắn hơn đối với những người mới đối với tất cả điều này, như tôi. Bạn có thể đọc thêm trong phần thiết kế giúp Qt nếu bạn tìm kiếm qmake, bao gồm các tài liệu tham khảo chức năng, nâng cao sử dụng, vv

Oh, một lời cuối cùng ... Tôi cũng đã phải thay đổi DEFINES += -DBUILD=$${BUILDNO} để DEFINES += BUILD=$${BUILDNO}, vì vậy -D là Không còn. Bên trong mã C++ của bạn, bạn sẽ sử dụng BUILD như thể bạn đã viết #define BUILD 1234 ở đầu tệp của mình.

+0

Đó là một lưu ý tốt về '-D'. Tôi sẽ chỉnh sửa câu trả lời của mình để sửa nó. –

+2

Sau một số thử nghiệm, rõ ràng là giải pháp này không hoàn hảo vì trong nhiều trường hợp, bước qmake không được thực hiện trong khi xây dựng vì "cấu hình không thay đổi". qmake xây dựng Makefile được sử dụng để xây dựng ứng dụng và cho nó cũng giải thích những gì chúng ta đã viết vào tệp * .pro, nhưng chỉ một lần. Trong Makefile, chúng ta tìm -DBUILD 29 thay vì BUILD build_number.sh ... Không có giải pháp nào để viết một cái gì đó trong Makefile vì nó được ghi đè khi qmake được thực thi. Bạn có thể thực thi qmake từ trình đơn Designer/Build, nhưng nó không tự động. Giải pháp cần thiết! –

6

Như tôi đã viết trước sau khi một số thử nghiệm tôi thấy rằng giải pháp ban đầu có vấn đề vì số phiên bản không được cập nhật mỗi khi xây dựng mới được thực hiện. Trong nhiều trường hợp, tôi đã chỉnh sửa một tệp nguồn, chạy bản dựng, nhưng vẫn có cùng số bản dựng ... Quá trình xây dựng chỉ quyết định rằng không có gì thay đổi và bỏ qua bước đã cập nhật số bản dựng. Lần đầu tiên tôi cố gắng tìm cách ép buộc bước đó, nhưng không thể tìm ra được. Cuối cùng tôi quyết định đi theo một cách khác. Bây giờ tôi sử dụng tập lệnh để tạo tệp tiêu đề build_number.h có chứa một số #define BUILD với số được cập nhật sau. Vì vậy, Calebs kịch bản bây giờ là một chút sửa đổi (build_number.sh):

#!/bin/bash 
number=`cat build_number` 
let number++ 
echo "$number" | tee build_number #<-- output and save the number back to file 
echo "#define BUILD ""$number" | tee ../MyProject/build_number.h 

Số incrementing vẫn được lưu trữ trong một tập tin gọi build_number.Tôi có thể tránh một tập tin thứ ba bằng cách phân tích cú pháp tập tin tiêu đề được tạo ra cho số, nhưng quyết định chống lại nó. Lưu ý rằng tập lệnh và tiêu đề được tạo nằm trong thư mục dự án trong khi tệp build_number nằm trong thư mục xây dựng. Điều đó không hoàn hảo, nhưng tôi có thể sống với nó.

Để kết hợp mọi thứ lại với nhau, hiện tại có một số việc cần làm. Đầu tiên tập tin tiêu đề được tạo cần phải được thêm vào dự án trong Nhà thiết kế Qt ... Nhấp chuột phải vào Header-Files và "Add existing file". Thứ hai, nó phải được bao gồm trong tệp C++ - nơi BUILD xác định bên trong được truy cập ... #include "build_number.h" ... và cuối cùng nhưng không kém một số bổ sung phải được thực hiện cho tệp dự án (MyProject.pro). Lưu ý rằng tôi đã xóa những thứ từ giải pháp Calebs, vì vậy chúng tôi bắt đầu từ đầu ở đây:

build_nr.commands = ../MyProject/build_number.sh 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

Những dòng (tôi đặt chúng trước khi phần tiêu đề) cưỡng chế thi hành của kịch bản, mà đọc số build cuối cùng từ build_number , increments nó, viết nó trở lại và cũng tạo ra một phiên bản cập nhật của tập tin build_number.h. Vì đó là một phần của nguồn của dự án nên giá trị mới được liên kết vào mã mỗi lần.

Có một điều cần đề cập - bây giờ quá trình xây dựng là không bao giờ với ý kiến ​​rằng không có gì thay đổi. Vì vậy, ngay cả khi bạn để mã của bạn không thay đổi, một lần chạy mới sẽ tạo ra một số phiên bản mới và xây dựng một tệp nhị phân mới. Các giải pháp cũ để lại số khi mã thay đổi, giải pháp mới này buộc một xây dựng mới ngay cả khi nguồn là không thay đổi, kể từ khi tôi buộc một sự thay đổi trong một tập tin tiêu đề đó. Người ta sẽ thích cái gì đó ở giữa nhưng vì tiêu đề chỉ được bao gồm ở một nơi mà việc xây dựng lại rất nhanh và không làm tổn thương nhiều. Nhưng vẫn còn, nếu ai đó biết làm thế nào để có được tốt nhất của cả hai thế giới xin vui lòng tư vấn cho. Ít nhất bây giờ tôi sẽ không có hai tệp nhị phân khác nhau với cùng một số phiên bản.

6

Windows tương đương cho giải pháp Joerg Beutel của cải tiến https://stackoverflow.com/a/5967447/1619432:

.pro:

build_nr.commands = build_inc.bat 
build_nr.depends = FORCE 
QMAKE_EXTRA_TARGETS += build_nr 
PRE_TARGETDEPS += build_nr 

HEADERS += build.h 

build_inc.bat:

@echo off 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt 
echo #define BUILD %var% >build.h 
echo %var% 

Cách sử dụng

#include "build.h" 
... 
qDebug() << "Build number:" << BUILD; 
+0

Ngoài ra, hãy xem http://qtcreator.blogspot.de/2009/10/generating-automatic-version-numbers.html để có sự bao gồm tinh tế hơn một chút (sử dụng chương trình tùy chỉnh để tạo tệp tiêu đề). – handle

-1

Tất cả các giải pháp tôi đã thấy cho đến nay đã quá phức tạp cho thị hiếu của tôi. Tôi đã nấu một giải pháp khá đơn giản hoạt động trên nền tảng ngay trong QtCreator. http://refaqtory.net/blog/?p=34

+0

Liên kết đó bị hỏng. – CodeLurker

1

Đây là giải pháp cho Win7 Tôi đã đưa ra dựa trên handle's solution. Giải pháp này cũng làm cho Windows cung cấp phiên bản yer # khi bạn nhấn chuột phải vào mục tiêu yer, và chọn Properties | Chi tiết. Nó hoạt động trong Win7, và có lẽ hầu hết các phiên bản trước đó.

Ok, bạn thực hiện build_inc.bat yer:

@echo off 
copy /b myapp.rc +,, 
set /p var= <build.txt 
set /a var= %var%+1 
echo %var% >build.txt 
echo #define BUILD %var% >build.h 

và đặt nó trong thư mục Proj yer. (copy /b myapp.rc +,, là không thể hiểu được Microsoft-eese để "chạm" - để cập nhật dấu thời gian của tệp.) Cho đến giờ, rất tốt - vì vậy cái gì? !!

Phần này là tùy chọn, nếu bạn không cần phiên bản được mã hóa thành nhị phân. Tạo tệp .rc, ví dụ::

#include "build.h" 

1 VERSIONINFO 
FILEFLAGS 32 
FILEVERSION 1, 0, BUILD, 0 
PRODUCTVERSION 1, 0, BUILD, 0 
FILEOS 4 
FILETYPE 1 

{ 
    BLOCK "StringFileInfo" 
    { 
     BLOCK "040904B0" 
     { 
      VALUE "FileDescription", "program" 
      VALUE "OriginalFilename", "program.exe" 
      VALUE "CompanyName", "you" 
      VALUE "FileVersion", "Release" 
      VALUE "LegalCopyright", "Copyright (c) 2016, you, fool!" 
      VALUE "ProductName", "Yer proggie" 
      VALUE "ProductVersion", "Release" 
     } 
    } 
    BLOCK "VarFileInfo" 
    { 
     VALUE "Translation", 0x0409, 0x04B0 
    } 
} 

Một phiên bản toàn diện hơn có sẵn ở đây: Versioning DLLs. BTW: Nó sẽ không hoạt động nếu không có khối VarFileInfo. Điều này .rc được sử dụng cho các công cụ như nhấp chuột phải và nhận được thông tin này trong Properties | Chi tiết. Tôi có cả tệp M $ .rc cho thông tin này và biểu tượng ứng dụng và thêm các tài nguyên khác trong Trình tạo Qt trong phần Tài nguyên.

Không nên tùy chọn: Đây là phần tôi đã dành chút thời gian để tìm. Trong Qt Creator, khi đã mở proer, hãy nhấp vào biểu tượng máy tính nhỏ và đặt nó vào chế độ phát hành. Nhấp vào "Dự án". Nhấp vào "Thêm bước xây dựng", chọn Bước quy trình tùy chỉnh và nhấp vào biểu tượng chiếc mũ "^" cho đến khi nó ở đầu danh sách. Giả sử bạn đã đặt tên là yer .rc, "myapp.rc". Hãy tha build bước đọc như sau:

Command: cmd.exe 
Arguments:/c build_inc.bat 
Working Directory: %{CurrentProject:Path} 

Trong khi một phiên bản qmake dựa trên thể làm việc tốt từ dòng lệnh hoặc các công cụ dòng lệnh gọi từ một IDE, trong Qt Creator, các bước xây dựng là một lợi thế, tôi tin. Qt Creator không thực sự chạy qmake cho mỗi bản dựng; nhưng các bước xây dựng được chạy mỗi lần xây dựng.

Bây giờ, thêm video này vào tập tin .pro yer:

RC_FILE += myapp.rc 

Ngoài ra, thêm myapp.rc để Proj yer. Nó sẽ hiển thị trong "Các tệp khác".

Bây giờ, hãy tạo lại. Mỗi lần xây dựng lại sẽ kích hoạt một liên lạc của tập tin tài nguyên, do đó chạy "rc" mỗi lần. Nếu không, số bản dựng sẽ không được mã hóa thành quyền nhị phân. Nó chạy nhanh cho tôi. Mỗi lần xây dựng lại sẽ tăng số lượng này. Tôi chỉ bận tâm thêm chúng vào bản phát hành "Release"; do đó, các bản dựng lỗi không làm tăng điều này. Họ sẽ chỉ sử dụng số lần xây dựng cuối cùng. Bạn sẽ cần phải chạy nó một lần trong phát hành để tránh một lỗi, tôi tin. Điều này hoạt động mà không cần chạy riêng qmake mỗi lần trong Qt Creator; và cung cấp cho bạn một số bản dựng khác nhau mỗi lần. Nó không kích hoạt bất kỳ biên dịch lại nào khác. Bạn có chi phí chạy "rc" và liên kết mỗi lần, trái với việc không làm gì nếu mọi thứ được cập nhật; nhưng OTOH, tôi làm điều đó cho bản phát hành chỉ; bạn hầu như luôn luôn liên kết để xây dựng hoặc chạy anyway; và một lần nữa, "rc" nhanh.

Tùy chọn: Bạn có thể di chuyển biểu tượng tiền xử lý BUILD ở bất cứ đâu bạn muốn. #. (Lưu ý: Bạn cũng có thể thêm biểu tượng ứng dụng yer với một cái gì đó như thế này:.

IDI_ICON1 ICON DISCARDABLE "Icons/myicon.ico" 

này làm cho nó hiển thị trong Explorer ngay cả trước khi tập tin được chạy)

Bạn cũng có thể thêm "build.h" để yer proj chính thức trong Qt Creator, bao gồm nó trong một tập tin bạn muốn sử dụng xây dựng # in, và sử dụng nó như là một chuỗi, ví dụ với:

#include <QDebug> 
#include "build.h" 

#define STR_EXPAND(tok) #tok 
#define STR(tok) STR_EXPAND(tok) 

qDebug() << QString("(build ")+STR(BUILD)+")"; 

Tôi vừa nhận thấy một tác dụng phụ: Nếu bạn làm theo cách này, nó sẽ xây dựng lại trước mỗi lần chạy trong Bản phát hành. Tôi đoán đó không phải là quá tệ để trả giá. Tôi đoán tôi luôn luôn có thể sao chép các runtimes vào thư mục phát hành, và chạy nó từ Explorer; hoặc chỉ cần đưa lên biên dịch bổ sung của about.h của tôi, chạy "rc" và liên kết với mỗi lần chạy trong bản phát hành. Đối với vấn đề đó, tôi chỉ có thể tạo một công cụ bên ngoài để chạy nó bằng phím tắt. Tôi chắc chắn sẽ mở ra bất kỳ cải tiến nào về vấn đề này. Trong thời gian này, tôi không bận tâm, chỉ cần biên dịch "about.cpp", chạy "rc" và liên kết với mọi lần chạy không mất nhiều thời gian. Tuy nhiên, mọi người: tự động tạo số!

☮!

Chỉnh sửa: Tùy chọn: Để làm cho nó tăng số bản dựng chỉ khi bạn xây dựng hoặc xây dựng lại dự án của bạn, nhưng không phải khi bạn chạy dự án (mặc dù bản dựng sẽ luôn xảy ra trong Bản phát hành), hãy vào Dự án | Xây dựng và chạy | Chạy, bấm vào nút "Add a Bước Triển khai" và chọn "Custom Process Bước":

Command: cmd.exe 
Arguments: /c if exist build.old copy /y build.old build.txt 
Working Directory: %{CurrentProject:Path} 

Sau đó, thêm

copy /y build.txt build.old 

sau @echo off trong file .bat. Thậm chí có thể, mặc dù có liên quan, để tạo các mẫu dự án mới tùy chỉnh: Extending Qt Creator Manual

Chỉnh sửa: Bây giờ tôi đã làm cho nó hoạt động với một, không phải hai bước xây dựng tùy chỉnh.

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