메이크파일 레시피 I

18173 단어 toolingjavascript
나는 한동안 Makefiles를 가지고 놀았고, 나는 여전히 당신이 태스크 러너로서 달성할 수 있는 결과에 만족합니다.

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.mdsrc/pages/example.md가 됩니다
  • css:home.lesssrc/resources/styles/home.less가 됩니다
  • js:app.jssrc/resources/scripts/app.js가 됩니다
  • app:components:App.sveltesrc/app/components/App.svelte가 됩니다
  • lib:helpers:api.jssrc/lib/helpers/api.js가 됩니다
  • res:styles:reset.csssrc/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.jsadd: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.lessrm: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
    

    좋은 웹페이지 즐겨찾기