🔥

Turborepoにhuksyを導入

2023/09/27に公開

はじめに

この記事では Turborepo に husky を導入する方法を紹介します。モノレポでも husky を利用できます。手順は簡単で、(1)ルートに husky と lint-staged を設定し、(2)各ワークスペースに lint-staged を設定ファイルを配置するだけです。

作業コードはこちらです。
https://github.com/hayato94087/turborepo-husky-sample

Turborepo とは

Turborepo とは、モノレポを作成するためのツールです。

https://turbo.build/repo

husky とは

husky とは git のフックを利用して、コミットやプッシュなどの前に任意のコマンドを実行できるツールです。husky を利用することで、コミットやプッシュの前に lint やテストを実行できます。

https://typicode.github.io/husky/

https://github.com/typicode/husky

lint-staged とは

lint-staged とは、git のステージングエリアにあるファイルに対して任意のコマンドを実行できるツールです。husky と組み合わせることで、コミットするファイルに対して lint、フォーマット、テストを実行できます。

https://github.com/okonet/lint-staged

モノレポを作成

まず、作業用のモノレポを作成します。

create-turbo で、Turborepo のモノレポを作成します。

モノレポ作成の詳細

$ pnpm dlx create-turbo@latest

>>> TURBOREPO

>>> Welcome to Turborepo! Let's get you set up with a new codebase.

? Where would you like to create your turborepo? turborepo-husky-sample
? Which package manager do you want to use? pnpm workspaces

Downloading files. This might take a moment.

>>> Created a new Turborepo with the following:

apps
 - apps/docs
 - apps/web
packages
 - packages/eslint-config-custom
 - packages/tsconfig
 - packages/ui

Installing packages. This might take a couple of minutes.

>>> Success! Created a new Turborepo at "turborepo-husky-sample".
Inside that directory, you can run several commands:

  pnpm run build
     Build all apps and packages

  pnpm run dev
     Develop all apps and packages

  pnpm run lint
     Lint all apps and packages

Turborepo will cache locally by default. For an additional
speed boost, enable Remote Caching with Vercel by
entering the following command:

  pnpm dlx turbo login

We suggest that you begin by typing:

  cd turborepo-husky-sample
  pnpm dlx turbo login

プロジェクトディレクトリーに移動します。

$ cd turborepo-husky-sample

web アプリケーションの page.tsx を以下で上書きし、サンプルのページを作成します。

apps/web/app/page.tsx
export default function Page(): JSX.Element {
 return (
   <h1 className="text-xl">Web</h1>
 );
}

.npmrc の中身を削除しておきます。

.npmrc
-auto-install-peers = true

さらに、.npmrc はリポジトリの管理対象外とします。

.gitignore
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
node_modules
.pnp
.pnp.js

# testing
coverage

# next.js
.next/
out/
build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# turbo
.turbo

# vercel
.vercel

+# npmrc
+.npmrc

ローカルで実行します。

$ pnpm dev --filter=web

Alt text

コミットします。

$ pnpm build
$ git add .
$ git commit -m "Turborepoの初期環境を構築"

husky をインストール

husky-init を実行することで、husky の初期設定します。

$ pnpm dlx husky-init && pnpm install

package.jsonparepare スクリプトが追加されます。

package.json
{
  "private": true,
  "scripts": {
    "build": "turbo run build",
    "dev": "turbo run dev",
    "lint": "turbo run lint",
    "format": "prettier --write \"**/*.{ts,tsx,md}\"",
+   "prepare": "husky install"
  },
  "devDependencies": {
    "eslint": "^8.48.0",
    "prettier": "^3.0.3",
    "tsconfig": "workspace:*",
    "turbo": "latest",
    "husky": "^8.0.0"
  },
  "packageManager": "pnpm@8.6.10",
  "name": "turborepo-husky-sample"
}

サンプルとして pre-commit フックが作成されています。pre-commit フックを利用すると、コミットすると npm test が実行されます。

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm test

コミットします。

$ git add .
$ git commit -m "huskyをインストール"

lint-staged をインストール

lint-staged をインストールします。

$ pnpm install -Dw lint-staged

.husky/pre-commitlint-staged を利用するように修正します。手動でも編集可能ですが、コマンドで変更が可能です。

$ npx husky set .husky/pre-commit "npx lint-staged"

実行後に以下のように変更されています。

.husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

-# npm test
+npx lint-staged

lint-staged を適用したいワークスペースに対して .lintstagedrc を設定します。

$ touch apps/web/.lintstagedrc
$ touch packages/ui/.lintstagedrc
apps/web/.lintstagedrc
{
  "**/*.{js,jsx,ts,tsx}": ["prettier --write", "eslint --fix"]
}
packages/ui/.lintstagedrc
{
  "**/*.{js,jsx,ts,tsx}": ["prettier --write", "eslint --fix"]
}

page.tsx の中身を以下のように変更します。

apps/web/app/page.tsx
export default function Page(): JSX.Element {
return (
<h1 className="text-xl">Web</h1>
);
}

コミットします。ログが書き出されます。

$ git add .
$ git commit -m "lint-stagedをインストールし設定"

✔ Preparing lint-staged...
✔ Running tasks for staged files...
✔ Applying modifications from tasks...
✔ Cleaning up temporary files...
[main 3f4ba8c] lint-stagedをインストールし設定
 6 files changed, 197 insertions(+), 10 deletions(-)
 create mode 100644 apps/web/.lintstagedrc
 create mode 100644 packages/ui/.lintstagedrc

そして、page.tsx の中身は以下のように変更されます。ちゃんとフォーマットされています。

apps/web/app/page.tsx
export default function Page(): JSX.Element {
  return <h1 className="text-xl">Web</h1>;
}

まとめ

この記事では Turborepo に husky を導入する方法を紹介しました。
モノレポでも husky を利用できます。設定方法も簡単でした。

作業コードはこちらです。
https://github.com/hayato94087/turborepo-husky-sample

参考

https://zenn.dev/g_okawara/articles/850d8e6729edfb

https://tech.motoki-watanabe.net/entry/2023/03/27/204456

https://github.com/fellipeutaka/ultimate-app

https://www.npmjs.com/package/lint-staged

https://zenn.dev/risu729/articles/latest-husky-lint-staged

https://blog.typicode.com/husky-git-hooks-javascript-config/

https://zenn.dev/g_okawara/articles/850d8e6729edfb

https://github.com/okonet/lint-staged#Configuration

https://zenn.dev/nozomi_iida/articles/20230223_setup_huskey

https://zenn.dev/seya/articles/c908d88df0a587

https://typicode.github.io/husky/getting-started.html#automatic-recommended

https://github.com/typicode/husky

https://qiita.com/kyntk/items/bd5488a7f25396aba719

Discussion