現在ちょっとしたCLIツールをDenoで開発していたときに起こっていた問題について書いていく。
問題の概要と原因
内容としては deno run
コマンドで構文エラーのあるファイルを読み込んでいるときに、エラーを検出しないパターンがあるというものである。
本来、このような場合はエラーが発生するのだが、エラー出力は行われずにエラーが起こる前の実行結果が表示されてしまうというものである。
(プログラム自体はキャッシュされており、こちらが実行されている形となる。)
私はまだDenoの仕様や内部実装について明るくないので、この問題についてDeno側にissueを登録していたがこの挙動はバグとなるようだった。
現在作業してくれているということなので、近いうちに修正されるかもしれない。
なお、実際に上げたissueは下記となる。
問題の原因などは下記で話されているので、こちらを参照してみてほしい。
事象の再現方法
ここでは、この問題の再現方法を記載していく。
割と起こりがちな内容であるような気がするので、同じようにDenoで開発されている方は気をつけたほうが良いかもしれない。
再現環境
まずは自身の環境を記載しておく。
(が、たぶん最新のDenoを利用している方であればOS関係なく再現されそう?)
$ deno --version deno 1.16.0 (release, aarch64-apple-darwin) v8 9.7.106.2 typescript 4.4.2
ステップ1
main.ts
を作成する。
console.log('Hi Deno');
このスクリプトを実行する。
deno run main.ts
実行結果は下記のとおりとなる。
Hi Deno
ステップ2
次にsub.ts
というファイルを作成する。
(このファイルは構文エラーを抱えている←ここがポイント)
// This code is syntax error export function hello(name: string) { return hello name; }
main.ts
内で sub.ts
を読み込むようにコードを修正する。
import { hello } from './sub.ts'; console.log(hello('Deno'));
Step1と同様にコードを実行する。
deno run main.ts
実行結果が下記となる。
(本来ならこのタイミングでエラーが検出される)
Hi Deno
ちなみに deno compile
コマンドでこれらのファイルをコンパイルしようとした場合は、想定通りの実行結果となる。
$ deno compile main.ts error: The module's source code could not be parsed: Expected ';', got 'name' at file:///Users/~/sub.ts:3:16
上にも書いたが、現在この問題に対する対応が行われているということなので、近いうちにこの問題は解消されるかと思われる。
追記:この問題は解決済み
上記問題についてだが対応も完了し、無事に作成したissueもcloseされている。
下記のコマンドで最新のDenoにupgradeした上で、上記プロセスを踏んでも問題は再現しないことを確認している。
deno upgrade