ContinousDelivery:带有Cake脚本和GitVersion的`AssemblyInfo.cs`版本信息

时间:2016-10-19 14:24:28

标签: c# msbuild cakebuild

我使用Cake使用GitVersion toolGitHub project)。

目前,我只使用我的build.cake

#tool "nuget:?package=GitVersion.CommandLine"

var target = Argument("target", "Default");

Task("Default")
  .Does(() =>
{
  Information("Hello World!");

  GitVersion(new GitVersionSettings{
    UpdateAssemblyInfo = true,
    OutputType = GitVersionOutput.BuildServer
  });

  GitVersion versionInfo = GitVersion(new GitVersionSettings{ OutputType = GitVersionOutput.Json });
  Information("Version: " + versionInfo.NuGetVersion);

  MSBuild("./CEST.sln");
});

RunTarget(target);

每次运行此脚本时,GitVersion都会更改我的Properties\AssemblyInfo.cs文件。所以,每次我执行这个脚本时,git警告我,我已经更改了文件。

我怎么能避免这个?

2 个答案:

答案 0 :(得分:3)

派对有点晚了,但是这里......

解决此问题的最简单方法是,当您在Continuous Integration Server上运行时,运行对GitVersion的初始调用。 (我假设您正在运行CI服务器,因为使用此服务器):

OutputType = GitVersionOutput.BuildServer

如果是这种情况,那么这样的事情可能更适合您的需求:

Task("Default")
    .Does(() =>
{
    Information("Hello World!");

    if (!BuildSystem.IsLocalBuild) 
    {
        GitVersion(new GitVersionSettings {
            UpdateAssemblyInfo = true,
            OutputType = GitVersionOutput.BuildServer
        });
    }

    GitVersion versionInfo = GitVersion(new GitVersionSettings{ OutputType = GitVersionOutput.Json });
    Information("Version: " + versionInfo.NuGetVersion);

    MSBuild("./CEST.sln");
});

这样,在versionInfo对象中进行本地构建时,您仍然可以访问断言的语义版本号,您可以在整个构建的其余部分使用它,但是,对AssemblyInfo.cs文件的更新没有发生,因此你的问题就消失了。

现在,你可以说你想要使用每个新语义版本更新AssemblyInfo.cs文件,但是,我认为你只有需要这个运送应用程序,通常仅作为CI构建的结果而不是本地构建。

您可以在我正在处理的Cake.Recipe项目中看到更深入的示例:

https://github.com/cake-contrib/Cake.Recipe/blob/develop/Cake.Recipe/Content/gitversion.cake

答案 1 :(得分:0)

然后一年后,我参加聚会很晚:D

我一直在寻找相似的东西,但是从来没有真正找到与我想要的东西相匹配的东西-能够在单个解决方案中为多个项目/装配体完成这项工作,并灵活地更改每个以具有自己的元数据/ versioning。这使我想到了一个自定义解决方案,将其重新用作Cake.Recipe任务,如下所示。依赖于您要AssemblyInfo.cs文件(通常是信息文件的c&p,通常在Project \ Properties下)所在目录中的第二个文件(AssemblyTemplate.cs),并使用通过GitVersion生成的SolutionInfo.cs文件(此目前是Cake.Recipe的默认设置,但您可以在任何地方进行调整)。它将模板中的行替换为生成版本中行的令牌。意味着您可以检入AssemblyTemplate.cs,gitignore AssemblyInfo.cs和SolutionInfo.cs,然后就完成了。您可以在开发箱或构建服务器上运行此命令,并将生成版本详细信息。 请介意。

可以使模板看起来像这样:

// For a static assembly version
[assembly: AssemblyVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("TEMPLATE")]
[assembly: AssemblyInformationalVersion("TEMPLATE")]
[assembly: AssemblyConfiguration("TEMPLATE")]

蛋糕代码:

Task("Generate-AssemblyInfo")
    .Does(() => {
        Information("Generate-AssemblyInfo started");

        // Read in solutioninfo
        var slnInfo = GetFiles(BuildParameters.SourceDirectoryPath + "/SolutionInfo.cs").FirstOrDefault();
        if(slnInfo == null) {
            Error("No solution info file could be found");
            return;
        }
        var slnData = System.IO.File.ReadAllLines(slnInfo.FullPath);
        //Debug(slnData);

        // Find template files
        var templateFiles = GetFiles("./**/AssemblyTemplate.cs");
        foreach(var file in templateFiles)
        {
            Information("Generating assemblyinfo from template: "+file);
            // Read AssemblyTemplate
            var templateData = System.IO.File.ReadAllLines(file.FullPath);

            // Replace template with Solutioninfo items
            var assemblyData = new StringBuilder();
            foreach(var line in templateData)
            {
                var templateToken = "(\"TEMPLATE\")";
                if(line.Contains(templateToken)) {
                    var attr = line.Substring(0, Math.Min(line.Length, line.IndexOf(templateToken)));
                    var replLine = slnData.Where(p => p.StartsWith(attr)).FirstOrDefault();
                    Debug("Replacing: "+attr+" in template "+file+" with "+replLine);
                    assemblyData.AppendLine(replLine);
                } else {
                    assemblyData.AppendLine(line);
                }
            }

            // Save AssemblyInfo
            var assemblyDataLines = assemblyData.ToString().Split(
                new[] { System.Environment.NewLine },
                StringSplitOptions.None
            );
            var assemblyInfoPath = new FilePath(file.GetDirectory() + "/AssemblyInfo.cs");
            System.IO.File.WriteAllLines(assemblyInfoPath.FullPath, assemblyDataLines);
        }
    });