Cake - экспериментальная ошибка компиляции коммутатора
Я пытаюсь использовать надстройку Cake-Plist и получил ошибку, что динамический еще не реализован в используемой версии Roslyn. Затем из советов для кого-то другого мне сказали попробовать-Экспериментальный переключатель. При использовании коммутатора я получаю следующую ошибку при попытке компилировать скрипт сборки.
Error: Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (2,1): error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
at Microsoft.CodeAnalysis.Scripting.Script.CompilationError(DiagnosticBag diagnostics)
at Microsoft.CodeAnalysis.Scripting.Script.GetExecutor(CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Scripting.Script.Run(Object globals)
at Microsoft.CodeAnalysis.Scripting.Script.Run(Object globals)
at Cake.Scripting.Roslyn.Nightly.DefaultRoslynNightlyScriptSession.Execute(Script script)
at Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host, FilePath scriptPath, IDictionary`2 arguments)
at Cake.Commands.BuildCommand.Execute(CakeOptions options)
at Cake.CakeApplication.Run(CakeOptions options)
at Cake.Program.Main()
Кто-нибудь знает, что вызывает эту ошибку?
3 ответа
Ссылка должна быть добавлена в Microsoft.CSharp.dll.
#reference "Microsoft.CSharp.dll"
https://gitter.im/cake-build/cake?at=57add5a3364ad7fc5acdb660
У меня была похожая проблема при запуске его на Mac (OSX El Capitan).
Я не мог найти Microsoft.CSharp.dll
где-нибудь на Mac (кроме как в моей установке MS Windows), и я не хотел добавлять его в качестве зависимости в один из моих проектов только ради того, чтобы заставить его так строить на Mac.
Я заметил, однако, что Mono.CSharp.dll
загружался в ./tools/Cake
папка. Это служит примерно той же цели, поэтому я попытался сослаться на это
#r "Mono.CSharp.dll"
Это тоже не сработало. Но когда я изменил его на
#r "./tools/Cake/Mono.CSharp.dll"
Это сработало отлично.
Теперь все, что мне нужно сделать, это определить, на какой платформе он работает, и использовать правильную
#r "xxx.CSharp.dll"
...
Вы можете использовать отражение вместо динамического. Чуть менее элегантно, но избегает проблем со ссылками Microsoft.CSharp.dll
а также Mono.CSharp.dll
,
Пример будет написан следующим образом.
#addin "Cake.Plist"
Task("update-ios-version")
.Does(() =>
{
var plist = File("./src/Demo/Info.plist");
var data = DeserializePlist(plist);
var itemPropertyInfo = data.GetType().GetProperty("Item");
itemPropertyInfo.SetValue(data, gitVersion.AssemblySemVer, new[] { "CFBundleShortVersionString" });
itemPropertyInfo.SetValue(data, gitVersion.FullSemVer, new[] { "CFBundleVersion" });
SerializePlist(plist, data);
});