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);
    });
Другие вопросы по тегам