msbuild c ++:如何提供所需的版本信息作为命令行参数?

时间:2011-02-03 12:50:01

标签: c++ msbuild cruisecontrol.net version

我正在CruiseControl.Net构建服务器上构建一个C ++应用程序。

构建本身由msbuild和cruisecontrol.net完成。我有所需的版本 - 但是我无法将其标记为c ++输出。

下面是我的msbuild项目文件。

感谢任何评论,

丹麦安德斯

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="FullBuild" ToolsVersion="3.5">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <UsingTask TaskName="NCover.MSBuildTasks.NCover" AssemblyFile="C:\Program Files\NCover\Build Task Plugins\NCover.MSBuildTasks.dll"/>
  <UsingTask TaskName="NCover.MSBuildTasks.NCoverReporting" AssemblyFile="C:\Program Files\NCover\Build Task Plugins\NCover.MSBuildTasks.dll"/>

  <ItemGroup>
    <MyBinaries Include="Build\*.*"/>
  </ItemGroup>

  <PropertyGroup>
    <CCNetLabel Condition="$(CCNetLabel)==''">2.0.0.0</CCNetLabel>
  </PropertyGroup>

  <ItemGroup>
    <Projects Include="$(vsproject)" />
  </ItemGroup>

  <Target Name="Rebuild">
    <MSBuild Projects="@(Projects)" StopOnFirstFailure="true" ContinueOnError="false" Targets="Rebuild" Properties="version=$(CCNetLabel)" />
  </Target>

</Project>

3 个答案:

答案 0 :(得分:5)

在您的buildscript中,创建一个如下所示的文件(version.info):

#define BINVERSION 1,2,3,4
#define STRVERSION "1.2.3.4"

您可能需要创建一个小实用程序来执行此操作。

在您的资源文件中,您将拥有一个版本信息资源,开头将如下所示:

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,2,3,4
 PRODUCTVERSION 1,2,3,4
(...)
    VALUE "FileVersion", "1.2.3.4"
    VALUE "ProductVersion", "1.2.3.4"

用以下内容替换:

VS_VERSION_INFO VERSIONINFO
 FILEVERSION BINVERSION
 PRODUCTVERSION BINVERSION
(...)
    VALUE "FileVersion", STRVERSION
    VALUE "ProductVersion", STRVERSION

不要忘记在资源文件的顶部添加#include "version.info"

现在编译应用程序时,它将具有正确的版本号。 (如果您正确创建了version.info)。

另请查看Automatic Build Versioning in Visual Studio (codeproject)

答案 1 :(得分:2)

我最后只做了一次搜索&amp;替换.rc文件。

Wimmels建议很好,但如果我需要编写一个自定义工具,我可以保持其余的简单。我尝试了一个免费软件搜索和替换工具,但它弄乱了rc文件的格式,并且更换自己非常简单。为了完整起见,我在下面提供了搜索替换代码。

全部谢谢!

丹麦安德斯

msbuild项目文件中的目标:

<Target Name="UpdateVersion">
    <Exec Command="..\CCNetConfig\tools\SearchReplace\SearchReplace.exe project\project.rc $(CCNetLabel)"/>
  </Target>

搜索&amp;替换:

  class Program
    {
        static void Main(string[] args)
        {
            if (args.Length!=2)
            {
                Console.WriteLine("Must call with two args:");
                Console.WriteLine("1 - File");
                Console.WriteLine("2 - Version");
                Environment.Exit(1);
            }

            var fileName = args[0];
            var version = args[1];
            var commaVersion = version.Replace(',', '.');

            var allLines = File.ReadAllLines(fileName).ToList();

            for (int i = 0; i < allLines.Count(); i++)
            {

                allLines[i] = allLines[i].Replace("1.0.0.1", version);
                allLines[i] = allLines[i].Replace("1,0,0,1", commaVersion);
            }

            File.WriteAllLines(fileName, allLines);
        }
    }

答案 2 :(得分:1)

从CruiseControl.Net的角度来看,一切看起来都很好。 CCNetLabel属性应具有正确的值。您可以使用Message任务将其打印出来以确定。

我对C ++项目没有任何经验,但是如果你没有使用Visual Studio 2010,MSBuild is only delegating the build to VCBuild这可能是你传入的版本没有被使用的原因(同样的事情应该发生)如果您使用例如/p:version=1.2.3.4手动调用MSBuild。

您可能需要查看this question。也许您可以通过覆盖vsprops文件来解决您的问题。