POSTD PRODUCED BY NIJIBOX

POSTD PRODUCED BY NIJIBOX

ニジボックスが運営する
エンジニアに向けた
キュレーションメディア

POSTD PRODUCED BY NIJIBOX

POSTD PRODUCED BY NIJIBOX

ニジボックスが運営する
エンジニアに向けた
キュレーションメディア

FeedlyRSSTwitterFacebook
François Zaninotto

本記事は、原著者の許諾のもとに翻訳・掲載しております。

私たちのプロジェクトではいつも、非常に長い Makefile を使用して、インストールやビルド、テスト、デプロイメントの処理を自動化しています。ターゲット名はほとんど標準化されていますが( make install make deploy )、中には説明が必要なものもあります( make run-dev make restart-api )。そして、詳細なmakeターゲットを追加するほど、それらの処理内容をテキスト形式で大量に記載しなければなりません。私たちのプロジェクトでは通常、このような文書を README ファイルに書いています。


しかしCLI(コマンドラインインタフェース)を用いる場合は、主に自己文書化ツールを使っています。 make と打つだけで、利用可能なコマンドとその説明が一覧表示されたら便利だと思いませんか?


それを実現するのは、実はとても簡単です。まずは各ターゲットを文書化するために、以下のようにターゲット名の後ろに ## を付けて、コメントを記載します。

install: ## Install npm dependencies for the api, admin, and frontend apps
    @echo "Installing Node dependencies"
    @npm install

install-dev: install ## Install dependencies and prepared development configuration
    @./node_modules/.bin/selenium-standalone install
    @cp -n ./config/development.js-dist ./config/development.js | true

run-frontend-dev: webpack.PID ## Run the frontend and admin apps in dev (using webpack-dev-server)

webpack.PID:
    @./node_modules/.bin/babel-node ./node_modules/.bin/webpack-dev-server \
        --content-base=build \
        --devtool=cheap-module-inline-source-map \
        --hot \
        --inline \
        --progress \
        & echo "$$!" > webpack.PID

stop-frontend-dev: webpack.PID ## Stop the frontend and admin apps in dev
    @kill `cat $<` && rm $<
    @echo "Webpack server stopped"

restart-frontend: ## Restart the frontend and admin apps in dev
        @make stop-frontend-dev && make run-frontend-dev
        @echo "Frontend app restarted"

内部ターゲット(この例では webpack.PID など)の説明は不要なので、自己文書化の対象外になります。次にシェルスクリプトのおまじないをいくつか実行して、 makefile help ターゲットを追加します。

.PHONY: help

help:
    @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

ポイント :このコードスニペットを makefile にコピーする場合は、必ずテキストエディタがインデントをタブに変換しているかどうか確認する。スペースに変換してはいけない。

ポイント printf パターン内の値 30 を大きい数字または小さい数字に変更することで、第1カラムの幅を調整する。

ポイント | sort を削除すると、ターゲットがアルファベット順ではなく、makefileに出現する順番に並べ替えられる。

ご紹介したすばらしいコードは、我々の協働者 Brice がインターネット上で見つけた 様々な スニペット に影響を受けて書いたものです。これはアウトプットの色付けにANSIコードを使っています。また、LinuxとOS Xの両方で利用できます。

仕上げ: help ターゲットをデフォルトのターゲットにする。

.DEFAULT_GOAL := help

これで、もう大丈夫です。 make は最も古いCLIタスクランチャの1つです。数多くのドキュメンテーションがあり、非常に強力で、どこにでもインストールできます。そのため、インラインヘルプを提供してくれるもののインストールが必要な言語固有のタスクランチャ( npm php bin/console など)の代わりに使うことが可能です。とにかく、 make を使うコツに興味がある場合は、私たちが書いた別の記事もご覧ください。そこでは make docker を組み合わせ、コンテナ内でコマンドを実行する make-docker-command というプロジェクトについて説明しています。

アップデート :本記事は「The Hacker News」のホームページで特集されました。関連の最新情報やご意見については https://news.ycombinator.com/item?id=11195539 をご覧ください。

監修者
監修者_古川陽介
古川陽介
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
複合機メーカー、ゲーム会社を経て、2016年に株式会社リクルートテクノロジーズ(現リクルート)入社。 現在はAPソリューショングループのマネジャーとしてアプリ基盤の改善や運用、各種開発支援ツールの開発、またテックリードとしてエンジニアチームの支援や育成までを担う。 2019年より株式会社ニジボックスを兼務し、室長としてエンジニア育成基盤の設計、技術指南も遂行。 Node.js 日本ユーザーグループの代表を務め、Node学園祭などを主宰。