2016-07-27 62 views
3

这是正常的,如果我指定的“输出类型” VS忽略了此设置由GitVersion别名返回的对象是不同的?对象从GitVersion不一致返回

如果我指定输出类型,则返回的对象的属性都是“空”,但是当我省略了设置,属性被设置为期望的值

例如:

Task("Version") 
.Does(() => 
{ 
var versionInfo = GitVersion(new GitVersionSettings() 
{ 
    UpdateAssemblyInfo = true, 
    OutputType = GitVersionOutput.BuildServer 
}); 
Information("MajorMinorPatch: {0}", versionInfo.MajorMinorPatch); 
Information("FullSemVer: {0}", versionInfo.FullSemVer); 
Information("InformationalVersion: {0}", versionInfo.InformationalVersion); 
Information("LegacySemVer: {0}", versionInfo.LegacySemVer); 
Information("Nuget v1 version: {0}", versionInfo.NuGetVersion); 
Information("Nuget v2 version: {0}", versionInfo.NuGetVersionV2); 
}); 

输出是:

MajorMinorPatch: [NULL] 
FullSemVer: [NULL] 
InformationalVersion: [NULL] 
LegacySemVer: [NULL] 
Nuget v1 version: [NULL] 
Nuget v2 version: [NULL] 

如果我改变我的任务,像这样:

Task("Version") 
.Does(() => 
{ 
var versionInfo = GitVersion(new GitVersionSettings() 
{ 
    UpdateAssemblyInfo = false 
}); 
Information("MajorMinorPatch: {0}", versionInfo.MajorMinorPatch); 
Information("FullSemVer: {0}", versionInfo.FullSemVer); 
Information("InformationalVersion: {0}", versionInfo.InformationalVersion); 
Information("LegacySemVer: {0}", versionInfo.LegacySemVer); 
Information("Nuget v1 version: {0}", versionInfo.NuGetVersion); 
Information("Nuget v2 version: {0}", versionInfo.NuGetVersionV2); 
}); 

的输出是:

MajorMinorPatch: 0.1.0 
FullSemVer: 0.1.0+1 
InformationalVersion: 0.1.0+1.Branch.master.Sha.5b2 
LegacySemVer: 0.1.0 
Nuget v1 version: 0.1.0 
Nuget v2 version: 0.1.0 

回答

3

这是 “由设计”。

https://github.com/cake-build/cake/blob/develop/src/Cake.Common/Tools/GitVersion/GitVersionRunner.cs#L71

GitVersion有JSON的一个默认的输出类型,这意味着它包含了所有的断言版本号的JSON输出可供查阅。此时,Cake会收集这个JSON输出,将它们组合成一个GitVersion对象,并将其返回给Cake脚本。

当您使用OutputType = GitVersionOutput.BuildServer没有JSON输出。相反,GitVersion工作与它正在运行的生成服务器,无论是TeamCity的,AppVeyor,或什么的,并使得通过其它机制可以断言的版本号。即通过设置环境变量或使用服务消息告知构建服务器。因此,Cake没有任何东西可以用来创建返回的GitVersion对象。

解决这个问题的典型方法是先用OutputType = GitVersionOutput.BuildServer运行GitVersion,然后立即再次运行它,并使用返回的变量。这实际上是我们自己的蛋糕脚本中做到:

https://github.com/cake-build/cake/blob/develop/build/version.cake#L38

运行此第二次实际上应该是非常快的,因为实际上GitVersion缓存第一次运行的结果。实际上我们可以在Cake中做些事情来读取这个缓存的输出,并将其用作调用的输出。你可以提出这个问题here所以我们可以跟踪它吗?

+0

这个“设计”似乎违反了最小惊讶的原则,我 – Schneider

+1

我不反对。这里的“设计”是在Cake中没有任何事情可以做,没有在GitVersion中首先进行更改。一旦完成,Cake将使用新功能,并根据需要返回变量。 –