at backyard

Color my life with the chaos of trouble.

deno runコマンドが構文エラーのあるファイルを読み込んでいるときに、エラーを検出しないパターンがある

現在ちょっとしたCLIツールをDenoで開発していたときに起こっていた問題について書いていく。

問題の概要と原因

内容としては deno run コマンドで構文エラーのあるファイルを読み込んでいるときに、エラーを検出しないパターンがあるというものである。
本来、このような場合はエラーが発生するのだが、エラー出力は行われずにエラーが起こる前の実行結果が表示されてしまうというものである。
(プログラム自体はキャッシュされており、こちらが実行されている形となる。)

私はまだDenoの仕様や内部実装について明るくないので、この問題についてDeno側にissueを登録していたがこの挙動はバグとなるようだった。
現在作業してくれているということなので、近いうちに修正されるかもしれない。

なお、実際に上げたissueは下記となる。

問題の原因などは下記で話されているので、こちらを参照してみてほしい。

github.com

事象の再現方法

ここでは、この問題の再現方法を記載していく。
割と起こりがちな内容であるような気がするので、同じように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