lesson-2_環境構築をしよう
🏭 環境構築をしよう
このプロジェクトは中級者向けということで、GitHubからある程度出来上がったプロジェクトをcloneするのではなく1 からプロジェクトを作成
していきます!
スマートコントラクトの作成に使う言語はRust
で す。比較的低水準の言語でsolidityと比べると注意しないといけない部分が多かったりしますが、その分後々起きるかもしれないバグを予防してくれているのでとても優秀な言語だと言えます。
ではRustでスマートコントラクトを作成するための環境を整えていきましょう。
Rust のインストール
まずは下のコマンドをターミナルで実行しRustをインストールしてください
$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
- Proceed with installation(default)
- Customize installation
- Cancel installation このようなメッセージが出てきたら、1のdefaultを選択してください。 インストールが成功していれば下のようなメッセージが表示されているでしょう
Rust is installed now. Great!
また、環境変数を設定するために下のコマンドをターミナルで実行させましょう(環境変数とは?)
source $HOME/.cargo/env
export PATH="$HOME/.cargo/bin:$PATH"
ここまでの設定が完了していることを確認するために下のコマンドをターミナルで実行させましょう
$ rustc --version
完了していれば以下のような形式のメッセージが表示されるはずです
rustc x.y.z (abcabcabc yyyy-mm-dd)
次にコンピュータからnearに接続するためのツールであるnear-cli
をどのディレクトリでも使えるように下のコマンドを実行することでグローバルにインストールしましょう!
npm install -g near-cli
これで環境構築は完了です!
ここからはプロジェクトを作成していきます。
まず、node
/ yarn
を取得する必要があります。お持ちでない場合は、こちらにアクセスしてください。
node v16
をインストールすることを推奨しています。
それでは本プロジェクトで使用するフォルダーを作成してきましょう。作業を始めるディレクトリに移動したら、次のコマンドを実行します。
mkdir NEAR-Election-dApp
cd NEAR-Election-dApp
yarn init --private -y
NEAR-Election-dAppディレクトリ内に、package.jsonファイルが生成されます。
NEAR-Election-dApp
└── package.json
それでは、package.json
ファイルを以下のように更新してください。
{
"name": "NEAR-Election-dApp",
"version": "1.0.0",
"description": "Create election dapp",
"private": true,
"workspaces": {
"packages": ["packages/*"]
},
"scripts": {
"contract": "yarn workspace contract",
"client": "yarn workspace client",
"test": "yarn workspace contract test"
}
}
package.json
ファイルの内容を確認してみましょう。
モノレポを作成するにあたり、パッケージマネージャーの機能であるWorkspacesを利用しています。
この機能により、yarn installを一度だけ実行すれば、すべてのパッケージ(今回はコントラクトのパッケージとクライアントのパッケージ)を一度にインストールできるようになります。
workspacesの定義をしている部分は以下になります。
"workspaces": {
"packages": [
"packages/*"
]
},
また、ワークスペース内の各パッケージにアクセスするためのコマンドを以下の部分で定義しています。
"scripts": {
"contract": "yarn workspace contract",
"client": "yarn workspace client",
"test": "yarn workspace contract test"
}
これにより、各パッケージのディレクトリへ階層を移動しなくてもプロジェクトのルート直下から以下のようにコマンドを実行することが可能となります(ただし、各パッケージ内にpackage.json
ファイルが存在し、その中にコマンドが定義されていないと実行できません。そのため、現在は実行してもエラーとなります。ファイルは後ほど作成します)。
yarn <パッケージ名> <実行したいコマンド>
最後に、NEAR-Election-dAppディレクトリ下に.gitignore
ファイルを作成して以下の内容を書き込みます。
**/yarn-error.log*
# dependencies
**/node_modules
# misc
**/.DS_Store
最終的に以下のようなフォルダー構成となっていることを確認してください。
NEAR-Election-dApp
├── .gitignore
├── package.json
└── packages/
これでモノレポの雛形が完成しました!
🗂 プロジェクトを作成しよう
コントラクト用のディレクトリ作成
packages
のディレクトリに移動して下のコマンドをターミナルで実行させましょう。
cargo new contract --lib
始めのcargo
はrustのパッケージを管理してくれるもので、JavaScriptで使っていたnpmのrust版と考えていただければOKです。
最後の--lib
はライブラリということを意味しています。これは、スマートコントラクトがライブラリだからです。これを付け忘れるとスマートコントラクトとして機能しないので忘れないように気をつけてください!
フロントエンドのディレクトリ作成
次にフロントエンドのセッティングもしていきます。packages
ディレクトリにいることを確認して以下のコードを実行しましょう。
npx create-near-app@3.1.0 --frontend=react --contract=rust client
コードを入力すると、2回ほどYes、Noを問われると思うので、全てYesを選択するで大丈夫です。
これによってコントラクトとフロントの接続をすでにコーディングしてくれている状態のプロジェクトを作成してくれます。
ではフロントエンド用のファイルが格納されたclient
ディレクトリ内にあるpackage.json
の中のname
欄を以下のように変更しましょう。
"name": "client",
このコードが意味しているのはフロント=react
で、コントラクト=Rust
で記述されているプロジェクトであるということです。
ここまででファイル構造は下のようなものになっているはずです。
下のコマンドをターミナルで実行すると確認できます。-L 2
は2つ下の階層まで、-F
はディレクトリを/
で表現するという意味です。
tree -L 2 -F
末尾が/
となっているものはディレクトリ、それ以外はファイルであることを示しています
NEAR-Election-dApp/
├── contract/
│ ├── Cargo.toml
│ └── src/
└── client/
├── README.md
├── ava.config.cjs
├── contract/
├── frontend/
├── integration-tests/
├── neardev/
├── node_modules/
├── out/
├── package.json
└── yarn.lock
もしも、command not found: tree
とエラーが出てしまった方は、以下の記事を参考にしてみてください。
https://dot-blog.jp/news/mac-zsh-tree/
https://dot-blog.jp/news/homebrew-how-to-install/
下のコマンドをターミナルで実行すると、あらかじめ用意されているコントラクトのコンパイルとデプロイがされた後にフロントエンドが起動されます!
yarn client dev
その結果下のようになっているはずです。
背景は時間帯によって変化するようなCSSが適用されているため、白くなっている可能性がありますが問題はありません。
もし、command not found: yarn
とエラーが出てしまった方は、以下の記事を参考にしてみてください。
https://asapoon.com/error/2795/command-not-found-yarn/
次にTailwind
の設定をしていきましょう
まずはclient
ディレクトリに移動して下のコマンドをターミナルで実行し、Tailwindのインストールとconfigファイルの生成をします。
yarn add -D tailwindcss postcss && npx tailwindcss init