2016-07-27 8 views
3

Нормально ли, что объект, возвращаемый псевдонимом GitVersion, отличается, если я укажу «OutputType» и опустив этот параметр?Объект, возвращенный из 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 для возврата.

Типичным способом для этого было бы сначала запустить GitVersion с помощью OutputType = GitVersionOutput.BuildServer, а затем немедленно запустить его снова и использовать возвращаемые переменные. Это на самом деле то, что мы делаем в нашем собственном Cake сценария:

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

Запуск это второй раз, должно быть на самом деле очень быстро, так как на самом деле GitVersion кэширует результат первого запуска. На самом деле может быть что-то, что мы можем сделать в Cake для чтения этого кэшированного вывода и использовать его в качестве вывода вызова. Не могли бы вы поднять это как вопрос here, чтобы мы могли отслеживать его?

+0

Это «по дизайну», кажется, нарушает принцип наименьшего удивления для меня – Schneider

+1

И я не согласен. «Дизайн» здесь заключается в том, что в Cake действительно ничего не может быть сделано, без внесения изменений в первую очередь в GitVersion. Как только это будет сделано, Cake будет использовать новые функции и возвращать переменные по мере необходимости. –