msbuild C ++: как мне предоставить информацию о желаемой версии в качестве параметра командной строки? - PullRequest
3 голосов
/ 03 февраля 2011

Я создаю приложение C ++ на сервере сборки CruiseControl.Net.

Сама сборка выполняется с помощью 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 ]

5 голосов
/ 05 февраля 2011

В вашем buildscript создайте файл (version.info), который будет выглядеть следующим образом:

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

Для этого может потребоваться небольшая утилита.

В вашемresourcefile, у вас будет ресурс versioninfo, запуск будет выглядеть так:

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).

Также взгляните на Автоматическое управление версиями сборки в Visual Studio (codeproject)

2 голосов
/ 07 февраля 2011

В итоге я просто выполнил поиск и замену файла .rc.

Предложение Wimmels было хорошим, но если бы мне нужно было написать собственный инструмент, я мог бы оставить все остальное простым Я опробовал один бесплатный инструмент поиска и замены, но он испортил формат файла rc, и заменить его действительно просто. Для полноты я добавляю код для поиска-замены ниже.

Спасибо всем!

Андерс, Дания

Цель в файле проекта msbuild:

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

Поиск и замена:

  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);
        }
    }
1 голос
/ 05 февраля 2011

С точки зрения CruiseControl.Net все выглядит хорошо.Свойство CCNetLabel должно иметь правильное значение.Вы можете распечатать его с помощью задачи Message , просто чтобы быть уверенным.

У меня нет опыта работы с проектами C ++, но если вы не используете Visual Studio 2010, MSBuild только делегирует сборку VCBuild , что может быть причиной того, что версия, которую вы передаете, не используется (то же самое должно произойти, если вы вручную вызываете MSBuild, например, /p:version=1.2.3.4).

Возможно, вы захотите взглянуть на этот вопрос .Возможно, вы могли бы решить и вашу проблему, переопределив файл vsprops.

...