2

我正在使用使用GitVersion 工具GitHub 项目)的Cake

目前,我只玩我的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 都会警告我我已经更改了一个文件。

我怎么能避免这种情况?

4

2 回答 2

3

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

解决此问题的最简单方法是在您在持续集成服务器上运行时运行对 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

于 2017-03-14T09:18:10.590 回答
0

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

我去寻找类似的东西,但从来没有真正得到与我所寻找的东西相匹配的东西——能够在一个解决方案中为多个项目/程序集进行这项工作,并灵活地更改每个项目以拥有自己的元数据/版本控制。这导致我找到了一个自定义解决方案,我将其重新用作 Cake.Recipe 任务,如下所示。依赖与您想要的 AssemblyInfo.cs 文件(只是 info 文件的 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")]

Cake.Recipe 代码:

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);
        }
    });
于 2018-06-29T00:46:18.277 回答