search
LoginSignup
12
Help us understand the problem. What are the problem?

posted at

updated at

deno.json(Deno設定ファイル)の書き方【随時更新】

2021年9月14日リリースのv1.14で、deno.json(Denoの設定ファイル)が導入されした。
この記事では、設定ファイルの書き方について解説します。

なぜdeno.jsonが導入されたか

元々、DenoにはCargo.toml(Rust)やpackage.json(Node.js)のような設定ファイルが存在しませんでした。
しかし、

  • 権限指定用のコマンドラインフラグ(--allow-xxxなど)が増えた
  • 既にコマンドラインフラグで指定できるファイルが存在している(import-maptsconfig
  • deno fmtやdeno lintに対する細かい設定を可能にして欲しいという要望が出ていた

という理由から、設定ファイルが導入されることになりました。

deno.jsonの特徴

Node.jsにおけるpackage.jsonやtsconfig.jsonの反省を踏まえた設計になっています。

  • ブラウザと同様、deno.jsonが無くても動作する(あくまでオプションという扱い)
  • ファイル中にコメントを書く場合は、拡張子をjsoncにする必要がある
  • 未知のプロパティを許可しない(他のプログラムの設定ファイルとして使うことはできない)
  • モジュールの読み込みには関与しない
    • ブラウザと挙動を合わせる
    • Denoにはパッケージの概念が無く、一つ一つのファイルがモジュールであり、web上のあらゆる場所から参照されうる
    • package.jsonの「パスのルートまで遡って設定ファイルを発見する」という動作は、URLからのimport時にサーバーに無駄な負荷をかける
  • 実行時のエントリポイントでのみ使用される

つまり、外部モジュールの読み込みには関与しません。
外部モジュールのトップにdeno.jsonが置いてあったとしても、外部モジュールをimportするプログラムからは単に無視されます。ここがpackage.jsonとの大きな違いです。

deno.jsonの構文

deno.json(例)
{
  "compilerOptions": {
    "allowJs": true,
    "lib": ["deno.window"],
    "strict": true
  },
  "lint": {
    "files": {
      "include": ["src/"],
      "exclude": ["src/testdata/"]
    },
    "rules": {
      "tags": ["recommended"],
      "include": ["ban-untagged-todo"],
      "exclude": ["no-unused-vars"]
    }
  },
  "fmt": {
    "files": {
      "include": ["src/"],
      "exclude": ["src/testdata/"]
    },
    "options": {
      "useTabs": false,
      "lineWidth": 80,
      "indentWidth": 2,
      "singleQuote": false,
      "proseWrap": "always"
    }
  },
  "importMap": "import_map.json",
  "tasks": {
    "serve": "deno run --allow-read=. ./src/serve.ts"
  }
}
  • compilerOptions: tsconfig.jsonと同じ内容を指定
  • lint: deno lintの設定
    • files:
      • include: lintするファイル
      • exclude: lintしないファイル
    • rules: deno lintで使用するルールを指定(ルールの一覧はhttps://lint.deno.land/ に掲載)
      • tags: ["recommended"]を指定するとデフォルトのルールセットになる
      • include: tagsに加えて適用するルール
      • exclude: tagsから除外するルール
  • fmt: deno fmtの設定
    • files:
      • include: フォーマットするファイル
      • exclude: フォーマットしないファイル
    • options: deno fmtの設定オプション
      • useTabs: "インデントにタブ(true)とスペース(false)のどちらを使用するか(デフォルト: false)
      • lineWidth: 1行当たりの文字数(デフォルト: 80)
      • indentWidth: インデントの文字数(デフォルト: 2)
      • singleQuote: 引用符にシングルクォーテーション(true)を使用するかダブルクォーテーション(false)を使用するか。(デフォルト: false)
      • proseWrap: 文章をMarkdownファイルで改行する方法(always又はnever又はpreserve、デフォルト: always
  • importMap: import-mapへのファイルパス(コマンドラインフラグに--import-map=<FILE>が渡された場合は、その値で上書きされる)
  • tasks: deno taskコマンドで使用されるコマンド名と内容

ファイル中にコメントを書く場合は拡張子をjsoncにします。
上記以外のプロパティがあった場合、エラーが発生します。

それぞれの機能が導入されたバージョンは、

  • v1.14:リンター・フォーマッター・tsconfigの設定をサポート
  • v1.18:設定ファイルの自動検出をサポート
  • v1.20:import-mapとタスクランナーをサポート

という時系列でした。将来的にはコマンドラインフラグの指定などにも使えるようになる見込みです。

deno.jsonの使い方

Deno1.18以降、deno.jsonは自動で読み込みされます。

例えばdeno fmt ./src/serve.tsのようにエントリポイントとなるファイル名を指定して実行した場合、ファイルが存在するディレクトリからルートに遡る形でdeno.jsondeno.jsoncが探されます。
deno fmtのようにエントリポイントを指定せずに実行した場合、カレントディレクトリからルートディレクトリに遡る形で、deno.jsondeno.jsoncが探されます。

> deno run ./src/serve.ts # ./srcからルートに向かってdeno.json(c)を探索
> deno fmt ./src/serve.ts # ./srcからルートに向かってdeno.json(c)を探索
> deno fmt # カレントディレクトリからルートに向かってdeno.json(c)を探索
> deno lint # カレントディレクトリからルートに向かってdeno.json(c)を探索
> deno task serve # カレントディレクトリからルートに向かってdeno.json(c)を探索

設定ファイルを強制的に指定して実行したい場合は、コマンドラインフラグの--configで指定します。

> deno run --config ./deno.json ./mod.ts

エディタの設定

vscode等の拡張機能も、自動読み込みが行われます。
強制的に指定する場合は./vscode/settings.json等のエディタ設定ファイルを開き、configプロパティにdeno.jsonへのパスを指定します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
12
Help us understand the problem. What are the problem?