dinkというDenoのモジュールマネージャーを作った
https://github.com/keroxp/dink
Denoのモジュール管理について考えるていたら、より汎用的な仕組みにしたくなった
keroxp.iconは結構Denoのモジュールを管理してるので
servest
deno-redis
deno-couchdb
dink
使い方
dinkいれる
code:bash
$ deno install dink https://denopkg.com/keroxp/dink/main.ts
modules.jsonを作る
code:modules.json
{
"https://deno.land/std": {
"version": "@v0.17.0",
"modules": "/fs/mod.ts", "/fs/path.ts", "/flags/mod.ts"
}
}
dink実行する
code:bash
$ dink -A
Linked: https://deno.land/std@v0.17.0/fs/mod.ts -> ./vendor/https/deno.land/std/fs/mod.ts
Linked: https://deno.land/std@v0.17.0/fs/path.ts -> ./vendor/https/deno.land/std/fs/path.ts
Linked: https://deno.land/std@v0.17.0/flags/mod.ts -> ./vendor/https/deno.land/std/flags/mod.ts
vendorディレクトリにこういうエイリアスファイルができる
code:txt
vendor
https
deno.land
std
fs/mod.ts
fs/path.ts
flags/mod.ts
中身はこうなってる
code:vendor/https/deno.land/std/fs/mod.ts
export * from "https://deno.land/std@v0.17.0/fs/mod.ts"
ESMのモジュールアグリゲーションを使い、module.jsonに記載されたバージョンprefixを挿入したURLをexportしている
こうすることで使う側からはバージョンを固定しなくても良くなる
code:index.ts
import * fs from "./vendor/https/deno.land/std/fs/mod.ts"
というのはdemと同じなのだけど…
dinkはdemと異なり、
module.jsonしかみない
dinkしかコマンドがない
リダイレクト先を探してリンクしてくれる
code:json
{
"https://denopkg.com/keroxp/servest": {
"version": "@v0.10.0",
"modules": "/server.ts"
}
}
こういうモジュールのエイリアスはこうなる(denopkg.comはraw.gihubusercontent.comにリダイレクトするので)
code:vendor/https/denopkg.com/keroxp/servest/server.ts
export * from "https://raw.githubusercontent.com/keroxp/servest/v0.10.0/server.ts"
この実態ファイルを特定してリンクできるのはかなりメリットがある
Denoはurlモジュールがリダイレクトされた場合、そのリダイレクト先にファイルを保存してしまう
のでtsconfig.jsonのpath記述ではこのリダイレクトを追えなくてコードジャンプが使えないというデメリットがある
urlとDenoのキャッシュファイルが対応するとIntelliJのコードジャンプが使えるので大変便利
https://gyazo.com/b6a581633013050a989f9a394ac0eb8c