acc templatesでエラーが出て困った話
少しでもレート上昇に繋がればと思いatcoder-cliを導入したのですが、acc templatesでエラーが出て結構苦労しました。同じことで困っている方への助けになればと思い投稿します。
はじめに
エラーが出て苦労したのは事実ですが、私はatcoder-cliは素晴らしいツールだと感じました。ネガティブな感情の下でこの記事を書いたわけではないので、その点だけご留意いただけると嬉しいです。素晴らしいツールを開発してくださった作者の方に感謝します。(GitHubの方でもを投げました。)
私の環境
OS: Windows10
どんなエラーだったのか&その解決方法
そもそもatcoder-cliのソースコードはどこにある?
atcoder-cliのソースコードのパスは以下の通りです。ユーザー名をご自身のものに変えてください。index.jsは改行の「か」の字もない感じで少し目に優しくないですが、あまり大きな変更はしないので安心してください。以下のエラー①とエラー②を解決すれば無事にacc templatesが使えるようになるはずです。
C:\Users\ユーザー名\AppData\Roaming\npm\node_modules\atcoder-cli\bin\index.js
エラー①
私の環境の場合acc templatesを実行すると以下のエラーが出てしまいました。
SyntaxError: Unexpected token in JSON at position 0
何か予期しないトークンが先頭に入ってしまっているようです。JSONファイルに問題があるのかと思いチュートリアルのtemplate.jsonの内容を貼り付けて再度実行してみたのですが解説せず。atcoder-cliのソースコードをいじる必要があると感じました。
エラー①解決方法
結論から言うと、エラー①に関してはsubstring()関数を使うことで解決できました。お使いのエディタでindex.jsを開き、「utf8」と検索すると、候補が2つ出ると思います。2つの候補の内、行数が若い方をクリックしてください。そして、以下のように変更してください。可読性のために改行を加えています。変更内容としては、
① 読み込んだファイルの内容を変数wに代入する。
② 変数qにwの先頭を除いたものを代入する。
③ JSON.parse(q)を変数nに代入する。
以上3点です。
const w=await i.promisify(a.readFile)(r.resolve(o,t,e.TEMPLATE_JSON_FILE_NAME),"utf8");
const q=w.substring(1);
const n=JSON.parse(q);
エラー②
ここで一回ターミナルを開いてacc templatesを実行してみてください。すると、今度はこのようなエラーが出ると思います。
TypeError: Assignment to constant variable.
「定数に代入はできないよ」と怒られてしまいました。
エラー②解決方法
このエラーは単純に定数から変数に変更することで解決しました。エラー①で変更した部分のすぐ下に以下のような記述があると思います。
[s,l]=await p(n);
この部分を以下のように変更しましょう。先頭にvarを付けるだけです。
var[s,l]=await p(n);
おわりに
この段階でacc templatesを実行すれば無事に作成したテンプレートが読み込めているはずです。この記事が少しでもお役に立てていたら幸いです。