Deno向けのmodule version manager dem の紹介です https://github.com/syumai/dem
Introduction to dem - module manager for Deno@__syumai
View Slide
Deno2018年6⽉にNode.jsの作者のRyan Dahlから発表されましたNode.jsの設計のよくなかった所を⾒直して、ゼロから再実装を⾏うことを⽬的としたプロジェクトです
DenoのモジュールシステムES ModulesのみしかないWeb互換を⽬指しているため独⾃のモジュールシステムを提供しないNode.jsにおけるnpmのようなパッケージ管理システムが存在しない
例import * as dejs from "https://deno.land/x/dejs/mod.ts";const body = await dejs.render(`<% for (let i = 0; i < 3; i++) { %>Hello, deno!<% } %>`, {});await Deno.copy(Deno.stdout, body);URL指定でimportしたmoduleがそのまま使えます
ES Modulesでのモジュール管理の問題
1.バージョンの管理が困難npmなどは、⼀つのpackageに対して、package.jsonなどでバージョンの指定が出来るDenoは、そのURLに存在するファイルをそのまま解決するため、⼀つのmoduleに対して⼀つのURLしか存在しない常に最新のmoduleへの参照しか持てないので、いつ壊れるかわからない
バージョン管理の解決策importするURLに直接moduleのバージョンを含むようにして固定するimport * as dejs from "https://deno.land/x/[email protected]/mod.ts";これで最新のmoduleしか参照できない問題は解消されます
2.バージョンの更新が⾯倒URLにmoduleのバージョンを含んでいるファイルの数が増えてくるとどんどん更新が困難になるProject全体に対して、⽂字列での置換を⾏う必要がある[email protected] => [email protected]など
バージョン更新の解決策deps.tsなどといったファイルに依存モジュールをまとめて、そこからexportするようにするdeps.tsexport * as dejs from "https://deno.land/x/[email protected]/mod.ts";export * as fs from "https://deno.land/[email protected]/fs/mod.ts";example.tsimport { dejs } from "./deps.ts";const body = await dejs.render(`...deps.tsを更新すれば、 dejs , fsを使っている全ファイル内のmoduleversionが更新されることになります。
3.不要なmoduleへの依存を持ってしまうdeps.tsを使うようにすると、今度は、 dejsにしか依存しないはずのexample.tsが fsに依存を持つようになってしまいました。これでは、 example.tsのモジュールとしての独⽴性が失われ、プロジェクト単位での依存管理に巻き込まれてしまいます。
ここで、demを紹介します
demDeno向けのmodule管理ツール
demの特徴特定のバージョンのモジュールへのエイリアスのファイルを⽣成するmodule管理がCLIで完結する
仕組みについてvendorディレクトリ配下に下記のようなファイルが⽣成されます内容は、特定のバージョンのモジュールへのエイリアスになるvendor/https/deno.land/x/dejs/mod.tsexport * from 'https://deno.land/x/[email protected]/mod.ts';
仕組みについて使う側はvendorからimportすればOKですimportするファイルにバージョンが含まれているので、使う側はバージョンを意識する必要がありませんimport * as dejs from './vendor/https/deno.land/x/dejs/mod.ts';
インストールdeno install dem https://deno.land/x/[email protected]/cmd.ts --allow-read --allow-write
使い⽅
プロジェクトの初期化$ dem init #プロジェクトの初期化successfully initialized a project.dem.jsonが作られます
moduleの追加バージョンを指定してmoduleを追加します$ dem add https://deno.land/[email protected]successfully added new module: https://deno.land/std, version: v0.15.0
ファイルの追加追加したいファイルを vendorからimportするようにTSのファイルを書き換えますdem ensureすると、⾃動で依存先へのエイリアスを作成します下記の例では、 fs/path.tsへのエイリアスを作成していますexample.tsimport * as path from './vendor/https/deno.land/std/fs/path.ts';console.log(path.join(Deno.cwd(), 'example'));Resolve module files used in project.$ dem ensuresuccessfully created alias: https://deno.land/[email protected]/fs/path.ts
モジュールの更新⼀⾏でまとめて更新できます$ dem update https://deno.land/[email protected]
demの課題依存先の依存先を固定できないdefault exportに対応できていない (keroxpさんのdinkは対応済みです)
感想モジュールの更新がとても簡単になりました!ぜひ使ってみてください