makefile: *** target pattern contains no `%'. Stop. を解決する

  • 公開:
  • 更新:
  • dev

make を使って docker-compose コマンドを実行しようとしたときにちょっとはまったので記事にします。
特に、筆者のような VSCode ユーザーは初見でつまづきやすいポイントかと思います。

結論

  • tab ではなく space でインデントを行っていたのが原因
  • VSCode の設定を変更する必要がある

Makefile

migration-create:
	docker container exec -it todos_backend sh -c "npm run typeorm:migration:create $(name)"

migration-generate:
	docker container exec -it todos_backend sh -c "npm run typeorm:migration:generate $(name)"

migration-run:
	docker container exec -it todos_backend sh -c "npm run typeorm:migration:run"

migration-revert:
	docker container exec -it todos_backend sh -c "npm run typeorm:migration:revert"

schema-drop:
	docker container exec -it todos_backend sh -c "npm run typeorm:schema :drop"

schema-sync:
	docker container exec -it todos_backend sh -c "npm run typeorm:schema:drop && npm run typeorm:migration:run && npm run typeorm:seed:run"

今回触っていた Makefile です。内容は以下のすばらしいハンズオンより。
Nest.js+MySQL で動く CRUD+認証 API サーバを Docker+VSCode+Swagger で構築してみる

エラー内容について

% make migration-generate name=CreateBaseTables
makefile:2: *** target pattern contains no `%'.  Stop.

target に%が含まれていないよ、という旨のエラーメッセージですが、ここでは直接的には関係ありません。

問題は、2 行目のインデントが、tab ではなく space で行われている点です。
VSCode では、デフォルトで tab が space に変換される設定になっており、Tab キーを押したとしても実際に入力されるのは space です。

解決方法

VSCode の Language Specific Settings を使います。
VSCode の settings.json を開き、以下の内容を追記します。

{
  "[makefile]": {
    "editor.insertSpaces": false,
    "editor.detectIndentation": false
  }
}

insertSpaces は、tab キーを押したときに space が入力される設定。

detectIndentationは、ファイルごとに既存のコードのインデントを検出し、それに合わせて space/tab の切り替えやインデントの大きさの調整を行ってくれる設定。

makefile ではこれらの設定を off にすることで、tab キーを押したときにちゃんと tab が入力されるようになります。

余談

VSCode の settings でeditor.renderWhitespace を有効化していると、tab と space が可視化されるので気づきやすくなります。

space ↑ space

tab ↑ tab

参考記事


お気づきの点があれば、 twitter のDMでご連絡ください。