我正在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>
答案 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文件来解决您的问题。