Emacs で Deno
最近 Rust で色々 CLI ツールを作って遊んでいるのですが、そのつながりで Rust で書かれた javascript ランタイムであるDenoの Getting started をちまちまやっていました。
言語は Typescript なので Emacs のTideでコード自動補完を有効化していたのですが、Deno での import 方法が対応していません。
import { serve } from "https://deno.land/[email protected]/http/server.ts";
// ↑ここで [An import path cannot end with a '. ts'extension.]
// もちろんインポートしたモジュールの自動補完も不可。
tsconfig.ts の編集で解決
【deno】「An import path cannot end with a '. ts'extension.」のエラーを回避する方法
上記の記事で大体問題無いんですが、ディレクトリ指定が Linux のものになっていたりするので Mac 用に補足しつつまとめます。
yarn
でtypescript-deno-plugin
をプロジェクトに追加
$ cd /path/to/my/deno/project
$ yarn add -D typescript-deno-plugin typescript
tsconfig.json に下記の記述を追加
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"deno": ["<deno の型定義ファイル(deno.d.ts)への相対パス>"],
"https://*": [
"<http でインストールしたパッケージのキャッシュディレクトリへの相対パス>"
],
"http://*": [
"<https でインストールしたパッケージのキャッシュディレクトリへの相対パス>"
]
},
"plugins": [
{ "name": "typescrip-deno-plugin" }
]
}
}
キャッシュディレクトリは OS 毎に異なりますので注意です(参考)。
Linux | Windows | MacOS |
---|---|---|
${HMOE}/.cache/deno | C:\Users\%USERNAME%\AppData\Local\deno | $HOME/Library/Caches/deno |
ここでは各環境の deno キャッシュディレクトリをCACHE_DIR
とします。
-
deno の型定義ファイルへの相対パス
${CACHE_DIR}/lib.deno.d.ts
-
http でインストールしたパッケージへの相対パス
${CACHE_DIR}/deno/deps/http/*
-
https でインストールしたパッケージへの相対パス
${CACHE_DIR}/deno/deps/https/*
特に相対パスの指定については間違えないように注意。記述後バッファを再読み込み(or Emacs 再起動)等をするときちんと反映されると思います。
一発で設定してくれる CLI ツール作った
やっぱり相対指定めんどくせー!てなったので、環境依存をクリアしつつ tsconfig.json の設定と yarn add してくれるパッケージを作りました。
Rust で書いたので今の所cargo
からのインストールのみ対応しています。
# deno-ls-init のインストール
$ cargo install deno-ls-init
# プロジェクトフォルダに移動
$ cd /path/to/your/deno/project
# deno 用の設定を実行
$ denolsinit
元からtsconfig.json
があっても既存部分は書き換えないのでご安心くださいませ。ただ、Mac でしかテストしていないので Windows とか Linux で動作おかしかったら issue とかでお願いします。