我使用Cake使用GitVersion tool(GitHub 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警告我,我已经更改了文件。
我怎么能避免这个?
答案 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);
}
});