Cakeビルド時エラー:Unknown token (2)

去年、Cakeビルド時のエラーについて触れました。

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

その後ソースを確認してみたところ、どうもTool(NuGet)を.cakeファイル内で読み込もうとすると、Globbingの際に一文字ずつこんな条件を満たすかどうかチェックしてるっぽい。

new Regex("^[0-9a-zA-Z\\+&%!@(). _-]$", RegexOptions.Compiled).IsMatch(character.ToString())

パスに使えない文字だけをホワイトリスト方式で検出するようにPR送ってもいいけど、対策見つけたんでちょっと保留。

対策

.cakeファイル内に#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0と書いてNuGetパッケージを読み込むのではなく、toolsディレクトリ内にpackages.configを置いてこんな感じに書いておく。

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="Cake" version="0.19.3" />
    <package id="NUnit.ConsoleRunner" version="3.4.0" />
</packages>

そうすると、bootstrapperを走らせた時にNuGetパッケージも復元してくれるので、パスにマルチバイト文字が含まれていてもビルド時にエラーにはならない(参考)。
マルチバイト文字なんか使わないのが一番なんだけど、リポジトリの都合上仕方がない場面もあるかと思います。そんな時は、bootstrapperでNuGet復元するようにしましょう。