[Deno] プロジェクトディレクト 案 その2

1つのプロジェクトディレクト内で複数のプロジェクトを格納するタイプ。

※他のスクリプト系とDenoは運用コンセプトが異なるので
 1.Deno自体をバージョン毎に使い分ける必要はない
 2.外部ライブラリのバージョンを意識するだけ(importで互換性指定が可能)

---- 必須拡張機能 ----
Deno (公式)
  拡張機能 ID: denoland.vscode-deno
  提供元: denoland (Deno公式チーム)
  役割: 型チェック、補完、フォーマット(整形)、リント(構文チェック)、デバッグ、テスト実行など、Deno開発に必要なすべての機能が含まれている。

 初期化(プロジェクトディレクトごとに行う必要がある)
 1.SHIFT+CTRL+P で Deno: Initialize Workspace Configuration

 VSCodeのアウトラインはDeno(公式)のものだけにする方法
  1.拡張機能で @builtin typescript と入力
  2.「Language Features for TypeScript and JavaScript files」で
    「無効にする(ワークスペース)」を選択
    
   ※識別子 vscode.typescript-language-features
----------------------


# ディレクトリ構造
[ユーザー名]-deno-world
├── .vscode/
├── .gitignore
├── deno.jsonc                     全体の共通設定
├── scripts/
│     └── backup.ts               全体バックアップ
├── dist/                          生成した配布物
├── apps/                          
│     ├── app1/                   ワークスペース1
│     │     ├── deno.jsonc       WSの専用設定
│     │     ├── scripts/
│     │     │     └── build.ts  配布物生成
│     │     ├── src/
│     │     │     ├── main.ts
│     │     │     └── shared/   WS内専用の共有コード
│     │     └── test/
│     └── app2/                   ワークスペース2
├── shared/                        全体の共有コード/ライブラリ
│     └── mod.ts
└── playground/                    実験コード


# 設定
## .vscode/settings.json
{
  "deno.enable": true,
  "deno.lint": true,
  "deno.cacheOnSave": true,
  "[typescript]": {
    "editor.defaultFormatter": "denoland.vscode-deno"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "denoland.vscode-deno"
  },
  "deno.suggest.imports.autoDiscover": true
}
## .gitignore
dist/ 
## ./deno.jsonc
{
  "compilerOptions": {
    "strict": true,                       // 厳格モード
    "exactOptionalPropertyTypes" : true,  // 正確なプロパティタイプに限定
    "noImplicitOverride": true,           // 暗黙のオーバーライドを禁止
    "noImplicitReturns": true,            // 暗黙の戻り値を禁止
    "noFallthroughCasesInSwitch": true,   // switch文の突き抜け防止
    "noImplicitAny": true                 // 暗黙のanyを禁止
  },
  "lint": {
    "rules": {
      "include": [
        "explicit-function-return-type",  // 暗黙の戻り値型を禁止
        "no-explicit-any",                // any 型を禁止 (unknown等への移行)
        "no-var",                         // var を禁止 (let/const を強制)
        "prefer-const",                   // 再代入しない変数の let を禁止
        "eqeqeq"                          // == ではなく === を強制
      ]
    }
  },
  "workspace": [
    "./apps/*",
    "./shared",
    "./playground/*"
  ],
  "tasks": {
    "check-update": "deno outdated",
    "update": "deno outdated --update",
    "backup": "deno run --allow-read --allow-write --allow-run scripts/backup.ts",

    "test-all": "deno test --allow-all",
    "lint-all": "deno lint",

    "start-app1": "deno task --cwd apps/app1 start",
    "build-app1": "deno task --cwd apps/app1 build"
  },
  "imports": {
      "@shared/root": "./shared/mod.ts"
  }
}
##./apps/app1/deno.jsonc
{
  "name": "app1",
  "version": "0.1.0",
  "tasks": {
    "start": "deno run --allow-all src/main.ts",
    "build": "deno run --allow-all scripts/build.ts"
  },
  "imports": {
    "@shared/local": "./src/shared/mod.ts"
  }
}