Nxでhardhatをいい感じにやる手順
Nx のmonorepoにhardhatをいい感じに組み込む手順。試行錯誤あり。
まずnx generate @nrwl/node:application
でnodeのアプリを生成する。
その時テストランナーをnone
にしておく。hardhatのsccafoldでmochaが入るからなんだけど、jestにまとめられそうな気はする。
npx nx generate @nrwl/node:application --name=contract --unitTestRunner=none
npx hardhat init
を monorepo rootで実行。templateはTypescriptのやつを選択。
生成先をさっき作ったnode appのpathにする。
✔ What do you want to do? · Create an advanced sample project that uses TypeScript
✔ Hardhat project root: · ./apps/contract
✔ Do you want to add a .gitignore? (Y/n) · y
依存パッケージをインストールするよう言われ、以下のコマンドが出てくるのでそのままインストール。
npm install --save-dev "hardhat@^2.7.0" "@nomiclabs/hardhat-waffle@^2.0.0" "ethereum-waffle@^3.0.0" "chai@^4.2.0" "@nomiclabs/hardhat-ethers@^2.0.0" "ethers@^5.0.0" "@nomiclabs/hardhat-etherscan@^2.1.3" "dotenv@^10.0.0" "eslint@^7.29.0" "eslint-config-prettier@^8.3.0" "eslint-config-standard@^16.0.3" "eslint-plugin-import@^2.23.4" "eslint-plugin-node@^11.1.0" "eslint-plugin-prettier@^3.4.0" "eslint-plugin-promise@^5.1.0" "hardhat-gas-reporter@^1.0.4" "prettier@^2.3.2" "prettier-plugin-solidity@^1.0.0-beta.13" "solhint@^3.3.6" "solidity-coverage@^0.7.16" "@typechain/ethers-v5@^7.0.1" "@typechain/hardhat@^2.3.0" "@typescript-eslint/eslint-plugin@^4.29.1" "@typescript-eslint/parser@^4.29.1" "@types/chai@^4.2.21" "@types/node@^16.4.13" "@types/mocha@^9.0.0" "ts-node@^10.1.0" "typechain@^5.1.2" "typescript@^4.3.5"
※ただこのまま実行すると typescript@4.5.2
がインストールされちゃうが、自分のプロジェクトではAngularがまだ4.4しか対応していないので typescriptだけバージョン下げる。
npm i -D typescript@4.4
eslintrc.js
が作られるけど特にsolidityに特有のルールは無いっぽいし、monorepoでまとめたいので消しとく。
hardhat init
で Nxで生成されたtsconfig.json
が上書きされるけど Nx の設定とはどう調整すればいいかな?
基本的にはhardhatで生成されたものを使ったほうが良さそう。
hardhat compile
の生成物をdist
に移動できそうだけどちょっとうまく行ってない。
hardhat.config.ts
にとりあえずこのように追記してみたけどcompileできなかった。
paths: {
artifacts: '../../dist/apps/contract/artifacts',
cache: '../../.contract/cache',
},
typechain: {
outDir: '../../dist/apps/contract/typechain',
externalArtifacts: ['../../dist/apps/contract/artifacts'],
},
hardhatのドキュメント見てみないと。
とりあえずapps/contract
内に生成しとこう。
"compile": {
"executor": "@nrwl/workspace:run-commands",
"options": {
"cwd": "apps/contract",
"command": "npx hardhat compile"
}
},
hardhat compile用に追加。cwdを追加しないと hardhat.config
が見つけられなくてエラーになる。
これで nx compile contract
で動くようになる。
他アプリでcontractのtypechain
の中身を使えるようにrootのtsconfig.base.json
を編集。
"paths": {
"@hoge/contract": ["apps/contract/typechain/index.ts"]
}