読者です 読者をやめる 読者になる 読者になる

Cakeビルド時エラー:Unknown token

Cake C# ASP.NET

Unknown token

最近C#/ASP.NETアプリのビルドにCakeを使うことが多くなったのですが、久しぶりにはまってしまったのでメモ。

ビルド対象のプロジェクトのパスにマルチバイト文字が含まれているとエラーになります。 0.15.2まではうまくいってたんだけど、0.16.0からエラーになるみたい。 普段日本語のプロジェクト名なんてほとんど使わないから気が付かなかった…

再現手順

こんな感じで適当なサンプルをcloneしてきて…

mkdir C:\マルチバイト
cd C:\マルチバイト
git clone https://github.com/cake-build/example
cd example

Verbosity=Diagnosticでビルドしてみると、こんなエラーを吐きます。

PS C:\マルチバイト\example> .\build.ps1
Preparing to run build script...
Running build script...
Module directory does not exist.
Analyzing build script...
Analyzing C:/マルチバイト/example/build.cake...
Processing build script...
Installing tools...
Error: System.NotSupportedException: Unknown token
   場所 Cake.Core.IO.Globbing.GlobTokenizer.ScanToken()
   場所 Cake.Core.IO.Globbing.GlobTokenizer.Scan()
   場所 Cake.Core.IO.Globbing.GlobParserContext.Accept()
   場所 Cake.Core.IO.Globbing.GlobParser.Parse(GlobParserContext context)
   場所 Cake.Core.IO.Globbing.GlobParser.Parse(String pattern, Boolean caseSensitive)
   場所 Cake.Core.IO.Globber.Match(String pattern, Func`2 predicate)
   場所 Cake.Core.IO.GlobberExtensions.Match(IGlobber globber, String pattern)
   場所 Cake.Core.IO.GlobberExtensions.GetFiles(IGlobber globber, String pattern)
   場所 Cake.NuGet.NuGetContentResolver.GetFiles(DirectoryPath path, PackageReference package)
   場所 Cake.NuGet.NuGetContentResolver.GetToolFiles(DirectoryPath path, PackageReference package)
   場所 Cake.NuGet.NuGetContentResolver.GetFiles(DirectoryPath path, PackageReference package, PackageType type)
   場所 Cake.NuGet.NuGetPackageInstaller.Install(PackageReference package, PackageType type, DirectoryPath path)
   場所 Cake.Core.Scripting.ScriptProcessor.InstallTools(ScriptAnalyzerResult analyzerResult, DirectoryPath installPath)

   場所 Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host, FilePath scriptPath, IDictionary`2 arguments)
   場所 Cake.Commands.BuildCommand.Execute(CakeOptions options)
   場所 Cake.CakeApplication.Run(CakeOptions options)
   場所 Cake.Program.Main()

なぜ?

どーやらCake.Core.IO.Globbing.GlobTokenizer.ScanToken()でthrow new NotSupportedExceptionされてるみたいなんだけど、なんでだろ? Commit履歴見てみると、ちょくちょくパスに使える文字を追加してる…ホワイトリストじゃなくて禁止文字だけ定義したブラックリスト方式でいいんじゃない?

gitterで聞いてみたところ、gep13に「issueあげてくれますか?」って言われたんで書いてみた→#1422
まあこの手のマルチバイト問題はよくあることですよね。まだCakeのソースは詳しく読んでないんで、年越しちゃうかな。