kintone CLI をざっくり試す

# 前置き

2019 年 10 月末にリリースされました [kintone CLI](https://github.com/kintone/kintone-cli)。
記事執筆時点（2020 年 6 月中旬）の時点ではバージョン 0.1.4 と正式リリースまではまだまだ遠そうな β 版で、しかも 3 ヶ月くらいバージョンアップが止まっていると言う若干死臭が漂いつつある感じがしますが、とは言えこれはかなりできるやつです。
ただ、いい感じに使うにはいい感じに準備や設定をしてあげなければいけない感じもあり、この記事ではその辺りを解説していきたいと思います。

## kintone CLI の立ち位置

**kintone CLI** は、役割としては [`Create React App`](https://github.com/facebook/create-react-app) とか [`Vue CLI`](https://cli.vuejs.org/) の kintone 版と考えれば良いでしょう。

このツールでは

- 対話式でプロジェクトを初期化
- ローカルサーバーでのリアルタイムプレビュー
- コマンドでカスタマイズをビルド＆デプロイ

と言った事が行えます。

よく似た名前の [**cli-kintone**](https://github.com/kintone/cli-kintone) とは全く関係なく、依存関係もありません。
（あちらは kintone をコマンドラインで操作するためのクライアントツール。[`psql`](https://www.postgresql.jp/document/11/html/app-psql.html) とか [`mysql`](https://dev.mysql.com/doc/refman/8.0/en/mysql.html) などと同じ立ち位置です。）

# 準備

## kintone CLI(β) のインストール

[公式](https://github.com/kintone/kintone-cli) の手順に従い、インストールを実施します。

```bash
npm install -g git://github.com/kintone/kintone-cli.git
```

## カスタマイズを適用するアプリを準備する

`kintone CLI` では、通常のアプリのカスタマイズ開発、あるいはプラグイン開発のいずれかのテンプレートを選択することになります。
今回は kintone 開発の大部分を占めるであろうアプリ向けカスタマイズを例に取り上げます。

カスタマイズを適用するアプリは（道中でアプリ ID の入力を求められるため）事前に準備しておくのがスムーズです。


# kintone CLI を使う

## プロジェクトを初期化する

アプリの準備ができたら、まずはプロジェクトを作ります。
ターミナルでプロジェクトを作成しようとするフォルダに移動しておいて、以下のように実行します。

```bash
kintone-cli init
```

対話式でいろいろ訊かれて来ます。
ここで入力したものは `package.json` に反映されます。

**Project name**
プロジェクト名を決めて入力します。
特段入力制限はないようですが、慣例的にスネークケースで書いとけばいいんじゃないでしょうか。

**Version**
バージョン番号です。

**Descirption**
プロジェクトの詳細を入力します。

**Author**
プロジェクトの作者。

**License**
ライセンスの種類。

**Do you want to use @kintone/kintone-ui-component?**
[kintone UI Component](https://github.com/kintone/kintone-ui-component) を利用するかどうか。
kintone の標準 UI ぽいアピアランスのコンポーネントがいろいろ用意されています。

**Do you want to use @kintone/kintone-js-sdk?**
[kintone JS SDK](https://github.com/kintone/js-sdk) を使用するかどうか。
**同 SDK は既に deprecated です。**
kintone の SDK は [@kintone/rest-api-client](https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client) が現在の最新ですから、ここは `no` にして後から `@kintone/rest-api-client` を手動で追加すれば良いでしょう。
と言うか `kintone CLI` 自身がこの辺りちゃんと追随してくれてれば良いのに。と思いますが。
なお`@kintone/rest-api-client` については[こちら](https://qiita.com/iShinkai/items/05402af2d16072dc76d2)にざっくりと記載しています。

今回は以下のような感じで実行しました。
<img alt="resized-02-001-kintone-cli-init.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/8d936d59-7c44-1af1-56b9-9718537e8b40.png">

## プロジェクトを作成する

ここまでの手順で行われたのは、

- プロジェクトを格納するフォルダを作成
- その中に `package.json` ファイルを作成
- git リポジトリの初期化

だけです。
実際にプロジェクトを作成するには、上のスクショでも示されている通り

```bash
kintone-cli create-template
```

を実行してくださいね。と促されます。
ところが、**これが実は罠**。
このまま続けて `kintone-cli create-template` を実行すると対話プロンプト自体は開始しますが、最後に無情にも `package.json not found.` と突っぱねられてしまいます。
つまり、先のコマンドで作成されたフォルダ（`package.json`があるフォルダ）に移動してから `kintone-cli create-template` しなきゃならないと言うトラップがありますので注意です。

実際のところは、**作成されたフォルダを VS Code で開き、ターミナルを開いて実行する**のがスムーズだと思います。

で、その対話式でいろいろ訊かれる内容ですが、また 1 つ 1 つ見ていきましょう。

**What type of app you want to create ?**
アプリ向けのカスタマイズ開発か、プラグイン開発かの選択です。

**Do you want to set authentication credentials ?**
認証情報をセットするかどうか。詳しくは後述します。

**What is your kintone domain ?**
カスタマイズを適用する先の kintone ドメインの指定。

**What is your kintone username ?**
当該環境にログインするためのユーザー名。

**What is your kintone password ?**
そのパスワード。入力はマスクされます。

**Do you use proxy ?**
接続にプロキシを使うかどうか。よしなに。

**Do you want to use React ?**
開発フレームワークとして `React` を使うかどうか。
執筆時点では `Vue.js` などは使えません。もちろん自前でセットアップすれば使えますが。

**Do you want to use TypeScript ?**
`TypeScript` を使用するかどうか。

**Do you want to use webpack ?**
バンドラーとして `Webpack` を使うかどうか。No にする理由はあまり思い当たらない。

**What is the entry for webpack ?**
`Webpack` を使用する際のエントリポイントとなるファイル。

**What is the app name ?**
これは結構重要です。
プロジェクトはここで指定された名前でディレクトリが切られ、ソースやら各種設定やら一式はその下に格納されます。
`Create React App` や `Vue CLI` がプロジェクト直下にそれらのファイルを作成するのとは対照的です。
無駄に階層が深くなるだけのような気がしますが、そういう設計思想みたいです。
そしてここで付けた名前が、ローカルプレビュー時やビルド・デプロイ時にも必要になって来ます。
ここは、「**app**」みたいなシンプルな名前にしておくのが良いと思います。

**Do you want to use @cybozu/eslint-config for syntax checking ?**
サイボウズ謹製の `eslint` 設定を利用するかどうか。

**What is the app ID ?**
カスタマイズを適用するアプリの **アプリ ID** を入力します。
ここでこの値を入力するため、事前にアプリを作っておく必要があるのです。
（適当な値を入れておいて、あとから設定ファイルを直接手で直してもいいのですが）

**What is the scope of customization ?**
カスタマイズをアプリの利用者全員に適用するか、管理者だけにするか、適用しないか。
kintone アプリの設定の「JavaScript / CSS でカスタマイズ」の「適用範囲」のラジオボタンに対応する項目ですね。
<img alt="resized-02-002-apply-target.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/8056181a-ef23-a1db-570a-7251c1316316.png">

今回は以下のような感じで実行しました。
<img alt="resized-02-003-kintone-cli-create-template.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/bc2d46d5-5d9d-839d-c9ed-b4159f5b0cbb.png">

この時点で以下のようなディレクトリ・ファイル構成となります。
<img alt="resized-02-004-filelist.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/0b8ae7d4-3445-a0cd-89e6-3d60db83090b.png">

この中で特に気を払って欲しいのが `app/auth.json` ファイルです。
**このファイルには認証情報が平文で記録されます。**
従ってこのファイルは **<span style="color: red">絶対にリポジトリに追加してはいけません。</span>**
もっとも、`.gitignore` ファイルにはきちんとこの `app/auth.json` ファイルを無視するようはじめから設定されています。
まかり間違ってこの記述を無効にしてしまわないよう十分に気をつけましょう。
「うちはソース管理は `SVN` なんだ」みたいな現場では `.gitignore` も効果をなさないわけで、この場合はものすごく注意が必要です。

`app/config.json` には、道中で設定したアプリIDやカスタマイズの適用先などの情報が含まれています。
自動作成されたものを後から修正する事はあまりないでしょうが、念のため内容を確認しておくと良いかと思います。

## 開発する

```
kintone-cli dev --app-name app --watch --localhost
```

と実行することで、ローカルサーバが立ち上がり、開発ビルドが走り、指定したアプリにカスタマイズが適用されます。
（`app` の部分は先ほどの `What is the app name ?` で答えたもの）
<img alt="resized-03-001-build.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/b0cd51e4-c53d-4e8a-64a5-fab357b3a3fd.png">

アプリのカスタマイズ設定には以下のように反映されます。
<img alt="resized-03-002-customization.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/79928227-6f16-8918-b64a-23265c009379.png">

アプリの実際の画面にも反映されています。
<img alt="resized-03-003-app.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/eadc45b0-2dd9-19b5-2238-3bc8cca64937.png">
ソースファイルに修正を加えれば、それを検知して自動ビルドがかかり、画面上にもすぐに反映されます。
とっても便利！

この際、他のカスタマイズが適用されていたら全て消えてしまいますので、この点は充分注意してください。

## ビルド＆デプロイする

とは言え、現時点ではローカルのファイルを参照しているだけであり、実運用には適しません。
ビルドし、デプロイするのは以下のようにします。

```
kintone-cli build --app-name app
kintone-cli deploy --app-name app
```

アプリ側にはちゃんとビルドされたファイルが適用されます。
<img alt="resized-04-001-customization.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/346be887-97d5-37d4-1e64-c582287c7bdf.png">
いちいち手動でファイルを適用してアプリの変更を保存する手間が省けます！
とっても便利！

# kintone CLI の至らないところをどうにかする

と言った具合に、非常に使い勝手が良いのでもっと向上して欲しいしもっと流行って欲しい`kintone CLI`ですが、さすが β 版と言ったところか、現時点ではいくつかの問題があります。
ただしこれらはある程度処置をすれば回避可能ですので、以下に微妙な点の内容と回避方法を解説します。
またこれらの問題は `kintone CLI` のバージョンアップに伴い改善される可能性があります。

## デフォルトポート 8000 問題

開発サーバを立ち上げると自動的にポート 8000 番で起動しようとします。
ポート 8000 番・・・だいたい何かしらで埋まってますよね。
違うポートを使いたい場合は、`package.json` の `scripts` の `dev` を以下のように、

```json:package.json
  "scripts": {
    "dev": "ws --port 8081",
    (省略)
  }
```

`ws` のあとに `--port (任意のポート番号)` とすれば OK です。

## kintone CLI コマンド長すぎ問題

[README](https://github.com/kintone/kintone-cli) を読む限り、`kintone CLI` には `dev`、`build`、`deploy`、`lint` などのサブコマンドがあります。
そして、例えば `dev` であれば、

```
kintone-cli dev [--app-name <App Name>] [--watch] [--localhost]
```

と記述されており、`--app-name <App Name>` パラメータは省略可能であるかのように読み取れます。
**しかしこれが罠。**
<img alt="resized-05-001-app-name-missing.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/b3bfe61e-41d0-df07-7181-f4706206a282.png">
無情！！！　アプリ名を付けないと怒られます。

従って、最低限

```
kintone-cli dev --app-name <App Name>
```

までは入力しなければ実行できません。

こんなのいちいち打ってられるか！！
第一 `<App Name>` は最初（`create-template` の時）に決めた名前で確定しているのだから、いちいち入力するのは非効率！！

と言う事で、こんな感じで `package.json` の `script` に入れてしまうのが良いでしょう。

```json:package.json
  "scripts": {
    "devel": "kintone-cli dev --app-name app --watch --localhost",
    "build": "kintone-cli build --app-name app",
    "deploy": "kintone-cli deploy --app-name app",
    "dev": "ws --port 8081",
    "build-app": "webpack --config app/webpack.config.js",
    "lint-all": "eslint . --ext .js,.jsx,.ts,.tsx",
    "lint-all-fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
    "lint-app": "eslint app/ --ext .tsx",
    "lint-app-fix": "eslint app/ --ext .tsx --fix"
  }
```

いちばん上の `devel` から 3 つめの `deploy` までの行を追加しています。
こうしておけば `npm run devel` とやるだけで開発サーバをウォッチ状態で実行できるようになるわけです。

## kintone オブジェクトのコード補完利かない問題

これ自体は `kintone CLI` 固有の問題と言うわけではありませんが。

デフォルトでは `kintone` オブジェクトは `app/source/global.d.tsx` ファイルで以下のように定義されています。

```typescript:app/source/global.d.tsx
declare let kintone: any;
```

`any` 型として定義されてしまっていますので、当然ながらコード補完は利かず、なんとも歯がゆい感じが拭えません。

これは、[kintone-extension](https://marketplace.visualstudio.com/items?itemName=kintone-extension.kintone-extension) を使えば解決できます。
VS Code を使って kintone 開発をしている人は正味な話マストってぐらいだと思うのですが、なぜか流行っていません。
[こちらの記事](https://qiita.com/iShinkai/items/49a3a4bfc863f2d92c98)でも紹介していますので、入れておくのが良いでしょう。

それと、`TypeScript` で開発を進めて行くならいずれにしろ必要になるので、[@kintone/dts-gen](https://github.com/kintone/dts-gen) もインストールして設定をしておきましょう。
[こちらの記事](https://qiita.com/iShinkai/items/f832ffd0436a3630832e#kintone-dts-gen)で解説しています。

## 他のカスタマイズが消えてしまう問題

上述した通り、アプリに対して別にカスタマイズを適用していた場合でも、`kintone-cli dev` や `kintone-cli deploy` に伴い、その設定は失われてしまいます。
（厳密には今回のカスタマイズで上書きされる動き）

例えば、複数の作業者が 1 つのアプリに対して個別にカスタマイズを開発しているなどと言うシチュエーションでは受容できないレベルの問題となるでしょう。

これに関しては、今のところ回避の術や次善策はありません。
既存のカスタマイズと併用したい場合は、そのカスタマイズスクリプトをこちらのプロジェクトに組み込むなどして対応するより他ないかなと思います。
この辺はなんとかなって欲しいかなと思いますけれども、難しそうだなとも思います。

## ソースの階層が 1 段低い問題

`kintone-cli create-template` は 1 つのプロジェクトで何度も実行することができ、その都度サブディレクトリが作られることから、このツールが設計思想として **1 つのプロジェクトに複数のアプリに対するカスタマイズを内包する**と据えているものと考えられます。

実際のカスタマイズの現場では 1 つのアプリに対する開発だけで済むことはあまりなく、多くは複数のアプリの組み合わせで 1 つの業務システムを構築するわけですから、そう言う意味ではそれを大きく 1 つのプロジェクトとして取り扱う思想は妥当性があります。
この記事ではアプリ名は **app** などシンプルな名前にするのが良いと言及しましたが、複数アプリに対するカスタマイズを開発するのであれば、シンプルかつ区別がつきやすい命名規則を考える必要があるでしょう。

ただまあ、1 つのプロジェクトでいくつものアプリのカスタマイズを抱えると言う事になると、その分 `package.json`の`scripts`がどんどん複雑になって来ると言う事にもなりますが。

## React じゃなく Vue.js 使えないんです？

現時点では使えないんですねえ・・・。
自前で `Vue.js` をプロジェクトに組み込んでやる必要がありそうですが、なかなか容易ではない感じがします。
理想としては `Vue CLI` で作ったプロジェクトに対して `kintone CLI` で開発・ビルド・デプロイができるようになれば結構に最強だと思うのですが。
このあたりは個人的にも調査を進めているところで、いい結果が得られたら記事にしたいと思っています。

**2020/06/23 追記**
`Vue CLI` と `kintone CLI` を（無理っくり）共存させる構成ができました。
以下で解説しています。

- [Vue CLI と kintone CLI の共存を探る（JavaScript 編）](https://qiita.com/iShinkai/items/5b9fb55518c47dc03e99)
- [Vue CLI と kintone CLI の共存を探る（TypeScript 編）](https://qiita.com/iShinkai/items/9aa400b1ca0425e452a5)

とは言え、やっぱり公式にサポートしてもらうのがいちばん良い。
（`kintone-cli create-template` の流れで `Vue.js` が選択できるようになれば良い）
しかしながら、そもそも `kintone UI Component` 自体が `React` 版しかないので、`kintone CLI` で `Vue.js` を公式サポートしてくれるようになるのは正直かなり可能性が低かろうなと思っています。

# まとめ

ここまで見て来た通り、ローカルサーバでカスタマイズのテストができる、コマンド一発でビルド・デプロイできると言う点だけをとってみても `kintone CLI` は大変に有用で、これだけでも使う価値がある。
UI ガッツリカスタマイズします系案件なら `kintone UI Component` も使えますし。

ただ、開発が滞っている雰囲気がすごい事、ディレクトリ構成が独特で他のいろんなツール類との調整が大変そうなところなど若干採用に二の足を踏むところがあるのも事実。

まずは単一アプリの比較的小規模なカスタマイズから利用していくと言うのが程よいラインかも知れません。

と言うことで、 `kintone CLI` のざっくりレビューでした！
どちら様も良き kintone ライフを！

# 参考

[kintone CLI を使って kintone カスタマイズ環境を構築する](https://qiita.com/sy250f/items/b9c4f11206e7ebae08ec)