2009-04-25 14 views
12

Bir exe veya dll dosyası oluşturan bazı C++ projem var. Proje bir SVN deposunda kontrol edilir. SVN'den revizyonu otomatik olarak exe/dll dosyamda gömülü olan sürüm kaynağı ile senkronize etmek istiyorum, yani sürüm $ major. $ Minor. $ Svn_revision.
Bunu nasıl gerçekleştireceğinizle ilgili herhangi bir fikir var mı? Mevcut herhangi bir çözüm mevcut mu?EXE/DLL dosyalarının SVN düzeltme ve sürüm ressources'i nasıl eşitlenir?

cevap

11

Eğer TortoiseSVN kurulu ise, o zaman yüklü bir program var, SubWCRev.

, dosyanıza, Bu değeri varsa: Böyle bir şey yürütmek eğer

Sonra
$WCREV$ 

en yüksek taahhüt revizyon numarası ile değiştirilir edeceğiz: Bu irade

SubWCRev .\ yourfile.txt.template yourfile.txt 

yourfile.txt.template'dan kopyalayın, ikameleri yapın ve yourfile.txt'a yazın.

Not: SubWCRev'u herhangi bir argüman olmadan çalıştırırsanız, bunların tümünü konsolda listeleyebilirsiniz, ayrıca kullanabileceğiniz başka birçok makro da vardır.

+4

SubWCRev ayrıca TortoiseSVN kullanmayan (isteyenler) için ayrı olarak mevcuttur: http://sourceforge.net /project/showfiles.php?group_id=138498&package_id=281312 – Stefan

+0

Harika, bunu bilmiyordum! –

+0

de benim gün için benim bu gerçeği :) –

2

Subversion Properties ve Subversion Keywords'a bakmak isteyebilirsiniz. Onlar her zaman bu lanetlenmiş $KeywordName: ...$ parçası içeren bu sorunu çözmezler. Özel özellikler, toplu iş dosyalarında meta verileri oluşturmak için güzel bir yöntem sunar ve ne değildir. Her neyse, birkaç yıl önce kaynak sorununa bir çözüm aradım ve bir tane bulamadım. Böylece kendi evimizdeki çözümümüzü yarattık. RC dosyamızı, oluşturma işlemi sırasında oluşturulan bir başlık dosyasını içerecek şekilde değiştirdik. RC, üstbilgiye bağımlıydı ve üstbilgi, üstbilgiyi oluşturmak için bir toplu iş dosyasını çalıştıran özel bir oluşturma kuralına sahipti. Aşağıdaki parçacık geçerli revizyonu svn info çıktısından çıkaracaktır.

: Son olarak, ürün bilgileri product-info.h adlı tanımlanmış bir ürün satırı sürümü dosyasını vardı

#ifndef component_info_h 
#define component_info_h 
#include "product-info.h" 
#include "version-stamp.h" 

#define VERS_MAJOR 1 
#define VERS_MINOR 2 
#define VERS_PATCH 3 
#define VERS_BUILD REPOSITORY_VERSION 

#define MY_COMPONENT_NAME "TPS Report Generator"  
#define MY_VERSION_NUMBER VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD 
#define MY_VERSION_STRING VERSION_STRING(VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD) 

#endif 

:

SET rootdir=%1 
SET svnrev=0 
PUSHD "%rootdir%" 
FOR /F "tokens=1-4 delims=: " %%I IN ('svn info') DO (
    IF /I {%%I}=={rev} SET svnrev=%%L 
) 
(ECHO./* 
ECHO. * version-stamp.h - repository version information 
ECHO. */ 
ECHO.#ifndef VERSION_STAMP_H 
ECHO.#define VERSION_STAMP_H 
ECHO.#define REPOSITORY_VERSION %svnrev% 
ECHO.#endif) > include\version-stamp.h 
POPD 

Sonra şöyle bir şey görünüyordu component-info.h adında bir bileşen spesifik sürümü damgalama başlığı oluşturdu
#ifndef product_info_h 
#define product_info_h 

#define PROD_VERS_MAJOR 0 
#define PROD_VERS_MINOR 1 
#define PROD_VERS_PATCH 0 
#define PROD_VERS_BUILD 0 

#define VSTR1(s) #s 
#define VSTR(s) VSTR1(s) 
#define VERSION_STRING(a,b,c,d) VSTR(a) "." VSTR(b) "." VSTR(c) "." VSTR(d) "\0" 

#define MY_COMPANY_NAME   "IniTech\0" 
#define MY_COPYRIGHT   "Copyright ©2009 " MY_COMPANY_NAME 
#define MY_PRODUCT_NAME   "\0" 
#define MY_PRODUCT_VERSION_NUM PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD 
#define MY_PRODUCT_VERSION_STR VERSION_STRING(PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD) 
#endif 

Ardından, kaynak dosyanız component-info.h'u içerir ve uygun tanımdaki çeşitli tanımları kullanır. aslar (ör., FILEVERSION MY_VERSION_NUMBER). Bu yapı, tüm sürüm damgalama sürecinde bize çok fazla esneklik ve izlenebilirlik sağlamıştır. Bir yığın dosyasındaki basit bir yığından bu çok seviyeli canavarlığa dönüştü ancak son birkaç yıldır bizim için çok iyi çalıştı.

Henüz kimsenin bunu yapmak için daha iyi bir yol bulamadığını düşünmek zor. Sonra tekrar, birkaç yıl boyunca araştırmamıştım. Bunu işleyen özel bir araç tanımlayan bir özel .rules dosya ekleyebilirsiniz varsayalım.

3

Bu çok yardımcı, teşekkürler. Bunu herhangi birisine yardım edersem Visual Studio 2008 için geliştirdim.

1/düzenlendi a/her proje içinde klasör oluşturun

/AssemblyInfo.cs.txt olarak Yapı klasörüne AssemblyInfo.cs Kopyalanan, Eylem oluşturmak set 2

"Yok"

3/Düzenlendi sürümüne sahip AssemblyInfo.cs.txt olarak özellikler: aşağıdaki

[assembly: AssemblyVersion("2.0.0.$WCREV$")] 
[assembly: AssemblyFileVersion("2.0.0.$WCREV$")] 

4/Eklendi Prebuild olaylara aşağıdaki:

SubWCRev $(SolutionDir) $(ProjectDir)\Build\AssemblyInfo.cs.txt $(ProjectDir)\Properties\AssemblyInfo.cs 

Bu, her derlediğinizde çalışır.

Ben Visual Studio ile VisualSVN/TortoiseSVN'ye ve VisualSVN Server kullanıyorum 2008.

GÜNCELLEME: Meslektaşım sadece onun çalışma kopyasını güncelledi ve AssemblyInfo.cs çakışmış

. Açık görünüyor. Bunu çözmek için VisualSVN kullanarak SVN'den çıkardım.

3

Program.X tarafından verilen yanıt harika çalışıyor. Ancak, değişikliklerinizi gerçekleştirmeden önce yürütülebilir dosyanızı kurarsanız, revizyonun, çalışan kodun gerçek revizyon numarasından bir tane daha olacağını ekleyeceğim. Bu azaltmak için, herhangi bir yerel değişiklikler varsa, 1 son koyacağız Yani

"2.0.$WCREV$.$WCMODS?1:0$" 

için versiyonlarını ayarlamak ve 0 değilse olabilir. Eğer daha sonra çalıştırıcınıza bakarsanız ve 2.0.54.1'i görüyorsanız, muhtemelen 55'in yeniden gözden geçirilmiş olduğunu biliyorsunuzdur.

+0

WCREV'de bulunan anahtar kelimeler hakkında daha fazla bilgiye buradan ulaşabilirsiniz: http://tortoisesvn.net/docs/release/TortoiseSVN_tr/tsvn-subwcrev-keywords.html –

+0

İyi nokta. Bunu fark ettim, bunu işaretlemek için iyi bir geçici çözüm gibi görünüyor. –

+1

Bunu beğendim, çünkü sürümün gerçekten bir SVN içeriğinin veya değiştirilmiş bir yapının 1: 1 yapısının olup olmadığını görebilirsiniz. – Stiefel

İlgili konular