메이크파일 레시피 I
These Makefile recipes are being used on my own template for frontend development: plate.
현재 작업 디렉토리
우리가 어디에 있는지 아는 것이 중요합니다. 최종 경로는 여기에서 상대적입니다.
PWD=$(shell pwd)
기본값
아래 구성은 GitHub 페이지에 배포하기 위한 것입니다.
src=build
from=master
target=gh-pages
message=Release: $(shell date)
템플릿
경로 대체는 일부 경로를 리베이스하는 데 사용됩니다.
page:example.md
는 src/pages/example.md
가 됩니다css:home.less
는 src/resources/styles/home.less
가 됩니다js:app.js
는 src/resources/scripts/app.js
가 됩니다app:components:App.svelte
는 src/app/components/App.svelte
가 됩니다lib:helpers:api.js
는 src/lib/helpers/api.js
가 됩니다res:styles:reset.css
는 src/resources/styles/reset.css
가 됩니다_src=src/$(patsubst js%,resources/scripts%,\
$(patsubst css%,resources/styles%,\
$(patsubst res%,resources%,\
$(patsubst page%,pages%,$(NAME)))))
_path=$(patsubst %/,%,$(_src))
_basedir=$(dir $(_path))
디렉토리
이러한 경로는 필요한 디렉토리 및 파일을 생성할 때 사용됩니다.
dirname=$(patsubst %/,%,$(_basedir))
filepath=$(patsubst $(_basedir),,$(_path))
환경 변수
기본 프로세스에 대한 표준 변수.
I'm getting
GIT_REVISION
to render a<meta name="revision" content="ef825dc">
tag in generated pages.
GIT_REVISION=$(shell git rev-parse --short=7 HEAD)
NODE_ENV=development
export NODE_ENV GIT_REVISION
대상
A phony target is one that is not really the name of a file; rather it is just a name for a recipe to be executed when you make an explicit request. There are two reasons to use a phony target: to avoid a conflict with a file of the same name, and to improve performance.
.PHONY: ? add rm dev test deps clean prune dist pages deploy
유틸리티
iif(...)
도우미는 조건부로 명령을 실행하는 데 사용되며 출력은 반환된 종료 코드에 따라 다릅니다.define iif
@(($1 > /dev/null 2>&1) && printf "\r* $2\n") || printf "\r* $3\n"
endef
입력
BODY
는 파일을 추가하는 데 사용되며 비어 있으면 대신 STDIN
로 대체됩니다.ifeq ($(BODY),)
BODY := $(shell bash -c 'if test ! -t 0; then cat -; fi')
endif
확인
check_defined(...)
도우미는 필요할 때 INPUT
유효성을 검사하는 데 사용됩니다.check_defined = $(strip $(foreach 1,$1, $(call __check_defined,$1,$(strip $(value 2)))))
__check_defined = $(if $(value $1),, $(error $2, e.g. $1=test))
이 파일의 모든 대상 표시
인수 없이 실행
make
하면 이 대상이 호출됩니다. 사용 가능한 작업 및 사용 예 목록을 표시합니다.?: Makefile
@awk -F':.*?##' '/^[a-z\\%!:-]+:.*##/{gsub("%","*",$$1);gsub("\\\\",":*",$$1);printf "\033[36m%8s\033[0m %s\n",$$1,$$2}' $<
@printf "\n Examples:"
@printf "\n make add:page NAME=example.md BODY='# It works!'"
@printf "\n make rm:Dockerfile"
@printf "\n make clean dev"
@printf "\n\n"
프로젝트에 파일 추가
make add
로 새 파일 작성 — 여기서 템플릿 add NAME=js/app.js
및 add:js:app.js
는 동일합니다.add: ## Create files, scripts or resources
@$(call check_defined, NAME, Missing file name)
@$(call check_defined, BODY, Missing file content)
@mkdir -p $(PWD)/$(dirname)
@echo $(BODY) > $(PWD)/$(filepath)
@printf "\r* File $(filepath) was created\n"
add\:%: ## Shortcut for adding files
@make -s add NAME=$(subst :,/,$*)/$(NAME) BODY=$(BODY)
프로젝트에서 파일 제거
make rm
를 사용하여 기존 파일을 삭제합니다. 여기서 템플릿 rm NAME=css/home.less
및 rm:css:home.less
는 동일합니다.rm: ## Remove **any** stuff from your workspace
@$(call check_defined, NAME, Missing file name)
@$(call iif,rm -r $(PWD)/$(filepath),File $(filepath) was deleted,Failed to delete $(filepath))
@$(call iif,rmdir $(PWD)/$(dirname),Parent directory clear,Parent directory is not empty...)
rm\:%: ## Shortcut for removing files
@make -s rm NAME=$(subst :,/,$*)/$(NAME)
개발 과제
make dev
작업으로 개발 워크플로를 시작합니다.dev: deps ## Start development
@npm run dev
테스트 작업
make test
작업으로 테스트 워크플로를 시작하십시오.test: deps ## Test for syntax issues
@npm run check
빌드 작업
make dist
작업으로 빌드 워크플로를 실행합니다.dist: deps ## Compile sources for production
@NODE_ENV=production npm run dist -- -f
종속성 확인
node_modules
가 이미 존재하고 준비되었는지 확인하는 데 유용한 작업입니다.deps: ## Check for installed dependencies
@(((ls node_modules | grep .) > /dev/null 2>&1) || npm i) || true
대청소
도구에서 캐시 파일을 제거하고
build
디렉토리도 삭제합니다.The
.tarima
file is a cached JSON from my tooling.
clean: ## Remove cache and generated artifacts
@$(call iif,rm -r $(src),Built artifacts were deleted,Artifacts already deleted)
@$(call iif,unlink .tarima,Cache file was deleted,Cache file already deleted)
종속성 정리
node_modules
가 프로젝트에서 완전히 제거되었는지 확인하십시오.prune: clean ## Remove all stuff from node_modules/*
@printf "\r* Removing all dependencies... "
@rm -rf node_modules/.{bin,cache}
@rm -rf node_modules/*
@echo "OK"
GitHub 페이지 분기
gh-pages
로 푸시하려면 분기가 이미 존재해야 합니다.pages: ## Fetch or create the target branch
@(git fetch origin $(target) 2> /dev/null || (\
git checkout --orphan $(target);\
git rm -rf . > /dev/null;\
git commit --allow-empty -m "initial commit";\
git checkout $(from)))
GitHub 페이지에 배포
파일을 빌드하고 변경 사항을 마스터로 푸시합니다
gh-pages
.deploy: pages ## Prepare and push changes on target branch
@(mv $(src) .backup > /dev/null 2>&1) || true
@(git worktree remove $(src) --force > /dev/null 2>&1) || true
@(git worktree add $(src) $(target) && (cp -r .backup/* $(src) > /dev/null 2>&1)) || true
@cd $(src) && git add . && git commit -m "$(message)" || true
@(mv .backup $(src) > /dev/null 2>&1) || true
@git push origin $(target) -f || true
Reference
이 문제에 관하여(메이크파일 레시피 I), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pateketrueke/makefile-recipes-i-569h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)