2008-11-20 37 views
10

Đây là vấn đề của tôi:Làm thế nào để thay đổi chương trình phiên bản sản phẩm của dự án?

Tôi có một số dự án triển khai. Để triển khai một ứng dụng, tôi cần thực hiện một số tác vụ, một trong số đó là thay đổi từng phiên bản sản phẩm của dự án triển khai và mã sản phẩm.

Tôi không thể tìm cách thay đổi chúng theo chương trình.

Có ai có thể giúp tôi không?

Xin cảm ơn trước.

CẬP NHẬT: Vì đó là dự án triển khai (cuối cùng tạo ra một trình cài đặt có thể thực thi), tôi không thể làm việc với MSBuild, thay vào đó tôi sử dụng Devenv từ dấu nhắc lệnh. (Bruno, cảm ơn phản ứng nhanh của bạn).

+0

loại dự án này là gì? C++ hoặc C#/vb? –

+0

Dự án là một triển khai triển khai C#, tôi đang sử dụng .Net 2.0. –

+0

bất kỳ giải pháp cuối cùng nào có mã nguồn đầy đủ? dự án vdproj là gì? – Kiquenet

Trả lời

10

Tôi đã tìm kiếm chính xác điều tương tự ngày hôm nay. Tôi tìm thấy điều này bằng cách sử dụng google:

static void Main(string[] args) 
{ 
    string setupFileName = @"<Replace the path to vdproj file>"; 
    StreamReader reader = File.OpenText(setupFileName); 
    string file = string.Empty; 

    try 
    { 
     Regex expression = new Regex(@"(?:\""ProductCode\"" = 
     \""8.){([\d\w-]+)}"); 
     Regex expression1 = new Regex(@"(?:\""UpgradeCode\"" = 
     \""8.){([\d\w-]+)}"); 
     file = reader.ReadToEnd(); 

     file = expression.Replace(file, "\"ProductCode\" = \"8:{" + 
     Guid.NewGuid().ToString().ToUpper() + "}"); 
     file = expression1.Replace(file, "\"UpgradeCode\" = \"8:{" 
     + Guid.NewGuid().ToString().ToUpper() + "}"); 
    } 
    finally 
    { 
     // Close the file otherwise the compile may not work 
     reader.Close(); 
    } 

    TextWriter tw = new StreamWriter(setupFileName); 
    try 
    { 
     tw.Write(file); 
    } 
    finally 
    { 
     // close the stream 
     tw.Close(); 
    } 
} 
+0

Tôi đã sử dụng phương pháp này, để thay đổi mã sản phẩm trên vsproj của tôi, để khi msi của tôi được xây dựng và chạy - nó nâng cấp độc đáo mà không yêu cầu người dùng xóa phiên bản trước đó. Rất cám ơn, tôi đã tìm cách để làm điều này trong một thời gian! –

+0

+1 Tôi có cùng một vấn đề và có vẻ như regex có thể là giải pháp đơn giản nhất. – Beta033

0

Bạn có thể sử dụng tác vụ msbuild để cập nhật phiên bản sản phẩm. Hãy xem this post từ nhóm MSBuild về chủ đề này.

+0

hiện tại (2012) AssemblyInfoTask là ai? – Kiquenet

1

Chúng tôi sử dụng chương trình cập nhật từng AssemblyInfo.cs hoặc AssemblyInfo.vb dựa trên giá trị tệp cấu hình. chúng tôi chạy tệp thi hành này trước mỗi bản dựng. Đó là điều tốt nhất chúng tôi có thể làm để tự động hóa quy trình này. Bạn có thể thêm cuộc gọi vào quy trình xử lý hàng loạt này trong cấu hình dự án của mình làm bước xây dựng trước.

+0

Điều này có thể được bao gồm trong quá trình xây dựng bằng cách sử dụng tiền tố. –

0

Điều này có thể không hoàn toàn là những gì bạn đang theo dõi, nhưng quay trở lại thời gian tôi viết một cái gì đó gọi là stampver, có thể tự động tăng số bản dựng trực tiếp trong tệp .exe.

5

Tôi biết rằng áp phích gốc đang tìm kiếm giải pháp .NET 2.0 cho vấn đề này. Tuy nhiên, vì điều này không được gắn thẻ như .NET, tôi sẽ cung cấp giải pháp C++ cho vấn đề này. Điều này có thể được áp dụng trong đất .NET, nhưng tôi sẽ để nó cho người khác.

Điều này không chỉ cập nhật thông tin phiên bản trong hộp giới thiệu và tệp nhật ký cho ứng dụng của tôi, mà còn tất cả thông tin phiên bản Windows được thấy trong Windows Explorer.

CẬP NHẬT: Đã thêm một số thay đổi mà tôi đã thực hiện cho quy trình kể từ câu trả lời ban đầu của mình.

Trước hết, tôi chuyển toàn bộ khối thông tin phiên bản từ tập tin Project.rc tôi để tập Project.rc2 tôi:

///////////////////////////////////////////////////////////////////////////// 
// 
// Version 
// 

VS_VERSION_INFO VERSIONINFO 
FILEVERSION FILE_VER 
PRODUCTVERSION PROD_VER 
FILEFLAGSMASK 0x3fL 
#ifdef _DEBUG 
    FILEFLAGS 0x1L 
#else 
    FILEFLAGS 0x0L 
#endif 
    FILEOS 0x4L 
    FILETYPE 0x1L 
    FILESUBTYPE 0x0L 
BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040904e4" 
     BEGIN 
      VALUE "CompanyName", "MyCompany" 
      VALUE "FileDescription", "Software Description" 
      VALUE "FileVersion", 1,0,0,1 
      VALUE "InternalName", "FileName.exe" 
      VALUE "LegalCopyright", "(c) 2008 My Company. All rights reserved." 
      VALUE "OriginalFilename", "FileName.exe" 
      VALUE "ProductName", "Product Name" 
      VALUE "ProductVersion", 1,0,0,1 
     END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
     VALUE "Translation", 0x409, 1252 
    END 
END 

này chủ yếu vận chuyển tất cả các phiên bản thông tin thứ mà bạn sẽ chỉnh sửa từ tài nguyên biên tập vào một tập tin riêng biệt. Điều này làm cho nó để bạn không nhận được lỗi khi chỉnh sửa các tập tin tài nguyên từ bên ngoài của trình soạn thảo. Nhược điểm là bạn không còn có thể chỉnh sửa thông tin phiên bản từ trình soạn thảo tài nguyên. Nhưng, vì chúng tôi muốn công cụ này được cập nhật tự động, đó không phải là vấn đề lớn.

Tiếp theo, tôi đã tạo một VersionInfo.h tập tin và thêm nó vào dự án của tôi:

#pragma once 

//major release version of the program, increment only when major changes are made 
#define VER_MAJOR 2 

//minor release version of the program, increment if any new features are added 
#define VER_MINOR 0 

//any bugfix updates, no new features 
#define VER_REV 0 

//if this is some special release (e.g. Alpha 1) put the special release string here 
#define STR_SPECIAL_REL "Alpha 1" 


#define FILE_VER VER_MAJOR,VER_MINOR,VER_REV 
#define PROD_VER FILE_VER 

//these are special macros that convert numerical version tokens into string tokens 
//we can't use actual int and string types because they won't work in the RC files 
#define STRINGIZE2(x) #x 
#define STRINGIZE(x) STRINGIZE2(x) 

#define STR_FILE_VER STRINGIZE(VER_MAJOR) "." STRINGIZE(VER_MINOR) "." STRINGIZE(VER_REV) 
#define STR_PROD_VER STR_FILE_VER " " STR_SPECIAL_REL 

#define STR_COPYRIGHT_INFO "©" BuildYear " Your Company. All rights reserved." 

sau đó tôi bao gồm VersionInfo.h trong file RC2 và thực hiện các thay đổi sau:

#include "VersionInfo.h" 
///////////////////////////////////////////////////////////////////////////// 
// 
// Version 
// 

<no changes> 
      VALUE "FileVersion", STR_FILE_VER 
      <no changes> 
      VALUE "LegalCopyright", STR_COPYRIGHT_INFO 
      <no changes> 
      VALUE "ProductVersion", STR_PROD_VER 
<no changes> 

Với thiết lập này, tôi có thể chỉnh sửa xây dựng kịch bản của tôi (sử dụng Perl) để sửa đổi thông tin phiên bản trong tệp VersionInfo.h trước khi xây dựng lại toàn bộ dự án bằng cách sử dụng dòng lệnh devenv.

Một bước bổ sung mà tôi đã thêm cũng có thể quan tâm (mặc dù chưa hoàn toàn được hoàn thiện và có thể là câu hỏi trong tương lai) là tạo số bản dựng duy nhất mỗi khi dự án được xây dựng. Trong hóa thân hiện tại, nó luôn hoạt động cho việc xây dựng lại hoàn toàn, nhưng chỉ thỉnh thoảng trên các bản dựng tăng dần. Những gì tôi đã làm là tạo một tệp có tên build_number.incl có chứa các thông tin sau:

#define CurrentBuildNumber "20081020P1525" 

Về bản chất, ngày và giờ bắt đầu xây dựng. Tôi tạo ra một tập tin thực thi được chạy như một sự kiện trước khi xây dựng cho dự án tạo ra tập tin này. Kịch bản cũng định nghĩa BuildYear để bản quyền trong tệp VersionInfo.h luôn chứa năm của bản dựng gần đây nhất. Tập lệnh lô là như sau:

echo Generating Build Number 
    @For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @(
    Set Month=%%A 
    Set Day=%%B 
    Set Year=%%C 
    ) 

    @For /F "tokens=1,2,3 delims=/M: " %%A in ('Time /t') do @(
    Set Hour=%%A 
    Set Minute=%%B 
    Set AmPm=%%C 
    ) 

    @echo #define CurrentBuildNumber "%Year%%Month%%Day%%AmPm%%Hour%%Minute%" > "$(ProjectDir)\build_number.incl" 
    @echo #define BuildYear "%Year%" >> "$(ProjectDir)\build_number.incl" 
    echo ---------------------------------------------------------------------- 

Tệp này sau đó được đưa vào bất kỳ tệp nào trong dự án cần sử dụng số bản dựng (ví dụ: hộp giới thiệu).

Một số này được lượm lặt từ this CodeProject post.

Hy vọng thông tin này chứng minh hữu ích.

-3

Xem xét việc sử dụng RCS, CVS và/hoặc lật đổ. Tôi chỉ quen thuộc với RCS; sự hiểu biết của tôi là CVS dựa trên RCS nhưng toàn diện hơn. Tôi đã đọc trên các bảng khác nhau mà lật đổ là tốt hơn, nhưng tôi chưa bao giờ sử dụng nó. RCS đã đủ để theo dõi các thay đổi và phiên bản trên tất cả các dự án tài liệu và phần mềm của tôi.

RCS là ở đây: http://www.cs.purdue.edu/homes/trinkle/RCS/

CVS là ở đây: http://www.nongnu.org/cvs/

Subversion là ở đây: biên tập tài nguyên http://subversion.tigris.org/

+0

Câu hỏi (IMO) không liên quan gì đến điều khiển phiên bản ... –

+0

Tôi cập nhật thông tin phiên bản trên mã nguồn bằng cách sử dụng git post-commit hooks. – ashwoods

0

Resource Tuner Console

console này cho phép tạo ra một đáng tin cậy và có thể lặp lại proces s để cập nhật tài nguyên Thông tin Phiên bản Sản phẩm trong giai đoạn cuối cùng của quá trình xây dựng từ dấu nhắc lệnh.

Xem đặc biệt là thao tác hàng loạt thông tin phiên bản tập tin trang để biết chi tiết hơn:

2

tôi đã cùng một vấn đề, và tôi phát hiện ra rằng sửa đổi .vdproj tệp trong một số prebuildevent không chính xác làm gì Tôi thích.

tôi đã sử dụng một số mã khác để chỉnh sửa các tập tin tập tin msi sau khi dự án thiết lập đã được xây dựng, vì vậy tôi sử dụng postbuildevent.

Xem bài đăng trên blog của tôi here.

+1

chạy vào cùng một vấn đề. VS không tải lại vdproj sau khi chạy bước prebuild vì vậy nó là cần thiết để xây dựng hai lần, hoặc sử dụng cách tiếp cận postbuild. – OSH

0

Tôi biết điều này là một chủ đề rất cũ, nhưng đây là một giải pháp vbs để đạt được cùng một mục. Chỉ cần đặt nó vào thư mục triển khai của bạn bên cạnh tệp .vdproj.

Function CreateGuid() 
    CreateGuid = Left(CreateObject("Scriptlet.TypeLib").Guid,38) 
End Function 

Const ForReading = 1, ForWriting = 2, ForAppending = 8 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set RegEx = CreateObject("VBScript.RegExp") 

For Each file in fso.GetFolder(".").Files 
    if (fso.GetExtensionName(file.Name) = "vdproj") then 
     WScript.Echo "Updating: " + file.Name 
     Set oFile = fso.OpenTextFile(file.Name, ForReading, True) 
     fileContents = oFile.ReadAll 
     oFile.Close 
     RegEx.Pattern = """ProductCode"" = ""8:{.*-.*-.*-.*-.*}" 
     fileContents=Regex.Replace(fileContents, """ProductCode"" = ""8:" & CreateGuid) 
     Set oFile = fso.OpenTextFile(file.Name, ForWriting, True) 
     oFile.Write fileContents 
     oFile.Close 
    end if 
Next 

Sau đó, trong dự án thực sự của bạn, có một sự kiện xây dựng bài tương tự như:

cd $(SolutionDir)\CustomWebSetup 
cscript -nologo UpdateProductCode.vbs 

này sẽ cập nhật vdproj với một ProductCode mới để chuẩn bị cho tiếp theo xây dựng. Sau khi quá trình xây dựng hoàn tất, VS sẽ nhắc tải lại dự án triển khai.

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