アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

clasp push でプッシュできないファイルがあると思ったら、仕様が変わってた

morishitaです。

最新のclaspでは .claspignore を設定しないと clasp push でプッシュされないファイルがあるよって話です。

以前自分が実装したGASのアプリケーションを機能拡張することになりました。
次のエントリで紹介したスプレッドシートをJSONにしてS3にアップロードするツールです。

tech.actindi.net

久々なので依存モジュールのバージョンが上がっています。
GASでは npm のモジュールが使えないので devDependencies だけでで数も少ないので、雑にyarn upgradeしてから作業を開始。

テストも書いてなかったのでこれを機に書きながら改修していこうと 次のエントリで紹介したように Jestとeslintとそれらの関連モジュールをインストールして作業を開始しました。

tech.actindi.net

あれ? プッシュされない

既存ロジックのテストを軽く書いて、リファクタおよびロジックの変更、追加を行いました。

ある程度まとまったところで一応、GAS上でも動作確認しておこうとclasp pushしてみました。
rootDir: 'src' として src 以下にコードを置いています。
src 以下のファイル構成は次のような感じです。

src
├── Code.ts
├── appsscript.json
├── lib
│   └── Utils.ts
└── template.html

※ 抜粋です。ディレクトリ構成は同じですが他にもファイルはあります。

今回、リファクタとしてlibというディレクトリを作ってユーティリティ的なモジュールはそちらに移動したのですが、このlib以下のファイルがプッシュされません。
あれ? と思ったものの、サブディレクトリを掘るほどファイル数も多くないしと思い直し、libディレクトリを廃止して中のファイルをsrc直下に移動してとりあえずやり過ごしました。

変更したロジックの動作をGASのWebエディタでも直接実行してみて問題なさそうなので実装を続けました。

このGASアプリは最終的にスプレッドシートに追加したメニューから実行するものです。
ほぼ実装を終えたところでE2Eテストとしてスプレッドシートからの操作を試してみました。
するとエラー。調べてみると操作時に「実行していいですか?」と確認ダイアログを表示するのですが、そのテンプレートとなるHTMLファイルが見つからないらしい。

気づいていなかったのですが、よく見るとHTMLファイルがプッシュされていません。
src 直下にあるのどうしてかな? js、tsファイルしかプッシュしないように仕様が変わったのかな? 
いやーそんなことしたら困る人いっぱいいるよね???

調べてみると

まさかHTMLはプッシュしない仕様に変わるわけはなかろうと思って、claspのリポジトリを見てみると...。

どうも、2.2.0から clasp push の仕様が変わっていました。
.claspignore がない場合、次の内容が自動的に適用される様になっています。

**/**
!appsscript.json
!*.gs    # 2.2.1 で追加
!*.js
!*.ts    
!*.html  # 2.2.1 で追加

おー、こいつのせいか。 .claspignore の設定は rootDir からの相対パスで評価されますが、 1行目の **/** で全無視のあと、rootDir の直下のファイルしか許可してない!

rootDir の直下のHTMLファイルがプッシュされなかったのは 2.2.0 を使っていたためです。 2019/07/11 時点での最新バージョンの2.2.1では修正されています。

空でもいいのですが、空でも必要なことを忘れて削除してしまうかもと思ったので 次の内容の設定で、.claspignore を追加しました。

# see https://github.com/google/clasp#ignore-file-claspignore
**/**
!appsscript.json
!**/*.ts
!**/*.html

これで無事、当初の予定通りlib ディレクトリもあるディレクトリ構成でソースを配置しつつ、 必要なファイルは全部プッシュできるようになりました。

まとめ

サブディレクトリにファイルを配置してソースを整理したい場合には .claspignore の設定が必要。

最後に

アクトインディではエンジニアを募集しています。 actindi.net