2010-02-10 8 views
7

msbuild ile derleme işlemimizi otomatikleştirmekle görevlendirildim. Yirmi adet Visual C++ projesi ve yirmi C# projemiz var, bu da tüm sürüm dizelerini düzenlemek için acı çekiyor. Sürüm numaralarımız yapım aşamasında et üretiyor, bu yüzden tam sürüm dizgisini komut satırında bir özellik olarak iletmeliyiz.Bir C++ kaynak dosyasındaki FILEVERSION güncelleştirmesini MSBuild kullanarak derleme hataları oluşuyor

Benim ilk uygulama .rc ve AssemblyInfo.cs dosyalar üzerinde değiştirmeler yapmak MSBuild Extension Pack 'ın File görevi kullandı.

<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyVersion\(".*"\)\]' Replacement='[assembly: AssemblyVersion("$(Version)")]'/> 
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyFileVersion\(".*"\)\]' Replacement='[assembly: AssemblyFileVersion("$(Version)")]'/> 
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="FILEVERSION\s+\S+" Replacement="FILEVERSION $(Version)"/> 
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="PRODUCTVERSION\s+\S+" Replacement="PRODUCTVERSION $(Version)"/> 
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"FileVersion",\s*".*"' Replacement='VALUE "FileVersion", "$(Version)"'/> 
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"ProductVersion",\s*".*"' Replacement='VALUE "ProductVersion", "$(Version)"'/> 

Bu AssemblyInfo.cs dosyalar üzerinde harika çalışıyor, ama ben böyle hatalar olsun ++ projeler C herhangi derleme yaparken: İlk hata hattında 23 karşılaşıldığında

.\MyProject.rc(23): error RC2135: file not found: 0x09 
.\MyProject.rc(71): error RC2135: file not found: 1 
.\MyProject.rc(72): error RC2135: file not found: 6 
.\MyProject.rc(73): error RC2135: file not found: 6 
.\MyProject.rc(74): error RC2135: file not found: 0x3fL 
.\MyProject.rc(80): error RC2135: file not found: FILEOS 
.\MyProject.rc(81): error RC2135: file not found: 0x2L 
.\MyProject.rc(84): error RC2164: unexpected value in RCDATA 
.\MyProject.rc(86): error RC2135: file not found: BLOCK 
.\MyProject.rc(88): error RC2135: file not found: VALUE 

ama ne zaman Kaynak kontrolüne karşı diff MyProject.rc her şey yolunda görünüyor. Sadece sürüm numaraları değiştirilir, bu değişiklikler satır 72'de başlar ve dosyada 0x09 dizesi görünmez. Dünyada neler oluyor burada? Çizgiler 21 - Böyle 25 görünüm:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 
#ifdef _WIN32 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 
#pragma code_page(1252) 
#endif //_WIN32 

Ben de aynı amacı gerçekleştirmek için başka yöntemler üzerinde herhangi önerilerinize açığım.

+0

'.' FILEVERSION'da 'Dosyayı doğru olarak almak için' ile '| Özellikleri | DLL'nin Ayrıntılar sekmesi. –

cevap

7

TaskAksiyonu Değiştir, rc dosyaları ASCII kodlamasını kullanırken Unicode karakterleri ekliyordu. Tüm rc değiştirme görevlerine TextEncoding = "ASCII" eklenmesi, tamamlanabilir dosyalar oluşturur.

ASCII karakter kümesinin kullanılmasının bir sınırlaması, © sembolünü kullanamayacağınızdır. Ancak TextEncoding = "Windows-1252" yi seçerseniz, sorunu çözer.

+1

[MSBuild Community Tasks] 'in (http://msbuildtasks.tigris.org/) 'FileUpdate' göreviyle aynı şeyi yapmaya çalışıyorum.Aynı şekilde çalışan bir "Encoding" özelliği ortaya çıkarırlar. –

+2

\t granadaCoder

+0

Jared için tekrar. Ve Anthony M'ye bağırıyorum ... MSBuild.Community.Tasks'i kullandığımdan beri ... ve senin (AnthonyM's) yorumumu google aramamı yaptı ... bir maçı bul. Sorunum, kodlamayı ayarlamadan ... sonuçta bazı tuhaf karakterler görmekti. Weirdo karakterleri: ï »¿ – granadaCoder

4

Ben AssemblyInfo.cs ve *.rc dosyalarından sürüm bilgisini ayırmak olacaktır. Tüm montajlarınız için (ortak) sürüm bilgisi içeren bir AssemblyVersion.cs ve Version.rc dosyası oluşturun. Bunları yapınızın başlangıcında üreteceksin. Yalnızca sürüm bilgisini içermediğinden, normal ifadeleri kullanmak zorunda kalmazsınız, tüm dosyanın üzerine her zaman yazabilirsiniz.

+0

"Bir şey daha fazla dolaylı bir katman tarafından çözülebilir" –

+0

İyi bir öneri. Tüm bu dosyaları bir kez düzenlediğimizde, her yaptığımızdan kesinlikle daha iyi, ancak yine de yapıya yeni projeler ekliyoruz ve bu eklemelerin sorunsuz olması hoş olurdu. Ayrıca, içsel programcı tembelliğim, herhangi bir el düzenlemesinden kaçınmam için bana bir çözüm sunmamı sağlıyor. – Jared

+0

Otomatik çözümü kullanmaya devam etseniz bile geçerli bir öneridir. Bir regex'i önleyebileceğiniz her zaman, siz altınsınız :) –

3

FILEVERSION aralıklarını (,) virgüllerle değiştirmeniz gerekir (.). Doğru biçim olmadan oluşturursanız, dosyanın sürümünü dosya özelliklerinde görmezsiniz | ayrıntılar sayfası. Gerekir gibi görünmese de, PRODUCTVERSION için aynısını yapardım.

ben MSBuild Property Functions kullandı. Eminim onları regex/değiştirebilirsiniz.

<FileSystem.File TaskAction="Replace" 
       TextEncoding="ASCII" 
       Files="@(AppResource)" 
       RegexPattern="FILEVERSION\s+\S+" 
       Replacement="FILEVERSION $(Version.Replace('.',','))"/> 
+0

Bana mülkle nasıl yaptığınızı gösterebilir. Aynı problemi çözüyorum ama çözemiyorum. @Anthony Mastrean – Ani

İlgili konular