рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдореЗрдХрдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдХрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

Makefiles рдХреНрдпрд╛ рд╣реИрдВ?


рдореЗрдХрдлрд╛рдЗрд▓ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╕реНрд╡рдЪрд╛рд▓рди рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рди рдХреЗрд╡рд▓ рдЧреЛ рдкрд░, рдмрд▓реНрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рдЕрдХреНрд╕рд░ Github рдФрд░ Gitlab рдкрд░ рдХрдИ рдЧреЛ рдРрдк рдХреА рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Go рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЗрдХрдлрд╛рдЗрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:

  • рд╕рд░рд▓ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдЖрд╣реНрд╡рд╛рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ, рдЬреИрд╕реЗ: рд╕рдВрдХрд▓рди, рдкреНрд░рд╛рд░рдВрдн, рд░реЛрдХ, рдШрдбрд╝реА, рдЖрджрд┐ред
  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ .env рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
  • рдПрдХ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдПрдХ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдЬреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
  • рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП GOPATH рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╣рдо рд╡рд┐рдХреНрд░реЗрддрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХреЗрдВред
  • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд░рд▓реАрдХреГрдд рдлрд╝рд╛рдЗрд▓ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ, рд╡реЙрдЪ рд░рди рдмрдирд╛рдирд╛ = "рдкрд░реАрдХреНрд╖рдг рдЬрд╛рдирд╛"ред / ... "

рдпрд╣рд╛рдБ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

.env Makefile main.go bin/ src/ vendor/ 

рдпрджрд┐ рд╣рдо рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдореЗрдХ рдХрдорд╛рдВрдб рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ:

 $ make Choose a command run in my-web-server: install Install missing dependencies. Runs `go get` internally. start Start in development mode. Auto-starts when code changes. stop Stop development mode. compile Compile the binary. watch Run given command when code changes. eg; make watch run="go test ./..." exec Run given command, wrapped with custom GOPATH. eg; make exec run="go test ./..." clean Clean build files. Runs `go clean` internally. 

рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░


рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рд╣рдо рдореЗрдХрдлрд╛рдЗрд▓ рд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 include .env 

рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝реЛрд▓реНрдбрд░ / рдлрд╝рд╛рдЗрд▓реЗрдВ, рдкрде рдкрд░ рдЬрд╛рдПрдБ ...

 PROJECTNAME=$(shell basename "$(PWD)") # Go . GOBASE=$(shell pwd) GOPATH=$(GOBASE)/vendor:$(GOBASE):/home/azer/code/golang #       . GOBIN=$(GOBASE)/bin GOFILES=$(wildcard *.go) #     ,       . STDERR=/tmp/.$(PROJECTNAME)-stderr.txt # PID-    ,       PID=/tmp/.$(PROJECTNAME)-api-server.pid # Make     Linux.   silent. MAKEFLAGS += --silent 

Makefile рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЕрдХреНрд╕рд░ GOPATH рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реА рд╕рднреА рдЯреАрдореЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ GOPATH рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╡реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдЕрд▓рдЧрд╛рд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХрдорд╛рдВрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ GOPATH рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред

 # exec:     GOPATH. : make exec run = " go test ./...тАЭ exec: @GOPATH=$(GOPATH) GOBIN=$(GOBIN) $(run) 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд┐рдХрд╛рд╕ рдореЛрдб


рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдЪрд╛рд╣рд┐рдП:

  • рдХреИрд╢ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ
  • рд╕рдВрдХрд▓рди рдХреЛрдб
  • рд╕реЗрд╡рд╛ рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рд╛рдПрдВ
  • рдХреЛрдб рдмрджрд▓рдиреЗ рдкрд░ рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред

рдпрд╣ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдард┐рдирд╛рдИ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╕рд╛рде рд╕реЗрд╡рд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓-рд╡реЙрдХрд░ рджреЛрдиреЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рдП рдФрд░ рдХрдВрдЯреНрд░реЛрд▓-рд╕реА рдпрд╛ рдХрдВрдЯреНрд░реЛрд▓-рдбреА рджрдмрд╛рддреЗ рд╕рдордп рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рди рдХрд░реЗрдВред

 start: bash -c "trap 'make stop' EXIT; $(MAKE) compile start-server watch run='make compile start-server'" stop: stop-server 

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

  • рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕реЗрд╡рд╛ рдЪрд▓рд╛рддрд╛ рд╣реИред
  • рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг-рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╛рдзрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд░реБрдХ рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИред
  • рдХреЛрдб рдмрджрд▓рдиреЗ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ, рдореИрдВ рдЗрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛ред

рд╕рдВрдХрд▓рди


рд╕рдВрдХрд▓рд┐рдд рдЖрджреЗрд╢ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рд┐рдд рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

рдЬрдм рд╣рдо рдмреНрд░реЗрдХрд┐рдВрдЧ рдПрдбрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЫрд╡рд┐

 compile: @-touch $(STDERR) @-rm $(STDERR) @-$(MAKE) -s go-compile 2> $(STDERR) @cat $(STDERR) | sed -e '1s/.*/\nError:\n/' | sed 's/make\[.*/ /' | sed "/^/s/^/ /" 1>&2 

рд╕рд░реНрд╡рд░ рдкреНрд░рд╛рд░рдВрдн / рдмрдВрдж


рд╕реНрдЯрд╛рд░реНрдЯ-рд╕рд░реНрд╡рд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдЗрдирд░реА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕рдХрд╛ PID рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд╡ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдЯреЙрдк-рд╕рд░реНрд╡рд░ рдкреАрдЖрдИрдбреА тАЛтАЛрдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИред

 start-server: @echo " > $(PROJECTNAME) is available at $(ADDR)" @-$(GOBIN)/$(PROJECTNAME) 2>&1 & echo $$! > $(PID) @cat $(PID) | sed "/^/s/^/ \> PID: /" stop-server: @-touch $(PID) @-kill `cat $(PID)` 2> /dev/null || true @-rm $(PID) restart-server: stop-server start-server 

рдирд┐рдЧрд░рд╛рдиреА рдмрджрд▓реЗрдВ


рд╣рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЙрдЪрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрдИ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдПрдХ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝рд╛рдЗрд▓ рдирд┐рдЧрд░рд╛рдиреА рдЙрдкрдХрд░рдг - рдпреЛрд▓реЛ рд▓рд┐рдЦрд╛ред рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 $ go get github.com/azer/yolo 

рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рд╣рдо рд╡рд┐рдХреНрд░реЗрддрд╛ рдФрд░ рдмрд┐рди рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 ## watch:      ,  make watch run="echo 'hey'" watch: @yolo -i . -e vendor -e bin -c $(run) 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЙрдЪ рдХрдорд╛рдВрдб рд╣реИ, рдЬреЛ рд╡реЗрдВрдбрд░ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдмрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЖрджреЗрд╢ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдмрджрд▓рдиреЗ рдкрд░ рдХреЙрд▓ рдореЗрдХ-рд╕реНрдЯрд╛рд░реНрдЯ-рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВ:

 make watch run="make compile start-server" 

рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдпрд╛ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ GOPATH рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

 make watch run="go test ./..." 

рдпреЛрд▓реЛ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХрд╛ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреБрд░рдВрдд рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЕрдкрдиреЗ рдХрдорд╛рдВрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ -a рд╡рд┐рдХрд▓реНрдк рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 yolo -i . -e vendor -e bin -c "go run foobar.go" -a localhost:9001 

рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 9001 рдЦреЛрд▓реЗрдВ рдФрд░ рддреБрд░рдВрдд рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:

рдЫрд╡рд┐

рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрдирд╛


рдЬрдм рд╣рдо рдХреЛрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдЕрдиреБрдкрд▓рдмреНрдзрддрд╛ рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рд╣реЛ рдЬрд╛рдПред рдЗрдВрд╕реНрдЯреЙрд▓ рдХрдорд╛рдВрдб рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧреА:

 install: go-get 

рдЬрдм рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдмрджрд▓рддреА рд╣реИ, рддреЛ рд╣рдо рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЙрд▓ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рджреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 make install get="github.com/foo/bar" 

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рдореНрди рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 $ GOPATH=~/my-web-server GOBIN=~/my-web-server/bin go get github.com/foo/bar 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЕрдЧрд▓рд╛ рднрд╛рдЧ рджреЗрдЦреЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЧреЛ рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЬрд╛рдУ рдХрдорд╛рдВрдбреНрд╕


рдЪреВрдБрдХрд┐ рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ GOPATH рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрднреА рддрдХ рдЧреЛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ Makefile рдореЗрдВ рд╕рднреА рдЧреЛ рдХрдорд╛рдВрдб рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 go-compile: go-clean go-get go-build go-build: @echo " > Building binary..." @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go build -o $(GOBIN)/$(PROJECTNAME) $(GOFILES) go-generate: @echo " > Generating dependency files..." @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go generate $(generate) go-get: @echo " > Checking if there is any missing dependencies..." @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go get $(get) go-install: @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go install $(GOFILES) go-clean: @echo " > Cleaning build cache" @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go clean 

рд╕рд╣рд╛рдпрддрд╛


рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрдорд╛рдВрдб рдХреА рд╕реВрдЪреА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдб рдФрд░ рдХреЙрд▓рдо рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕рд╣рд╛рдпрддрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 help: Makefile @echo " Choose a command run in "$(PROJECTNAME)":" @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /' 

рдирд┐рдореНрди рдХрдорд╛рдВрдб ## рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдХрдлрд╛рдЗрд▓ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рд╣рдо рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 ## install: Install missing dependencies. Runs `go get` internally. install: go-get ## start: Start in development mode. Auto-starts when code changes. start: ## stop: Stop development mode. stop: stop-server 

рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:

 $ make help Choose a command run in my-web-server: install Install missing dependencies. Runs `go get` internally. start Start in development mode. Auto-starts when code changes. stop Stop development mode. 

рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг


 include .env PROJECTNAME=$(shell basename "$(PWD)") # Go related variables. GOBASE=$(shell pwd) GOPATH="$(GOBASE)/vendor:$(GOBASE)" GOBIN=$(GOBASE)/bin GOFILES=$(wildcard *.go) # Redirect error output to a file, so we can show it in development mode. STDERR=/tmp/.$(PROJECTNAME)-stderr.txt # PID file will keep the process id of the server PID=/tmp/.$(PROJECTNAME).pid # Make is verbose in Linux. Make it silent. MAKEFLAGS += --silent ## install: Install missing dependencies. Runs `go get` internally. eg; make install get=github.com/foo/bar install: go-get ## start: Start in development mode. Auto-starts when code changes. start: bash -c "trap 'make stop' EXIT; $(MAKE) compile start-server watch run='make compile start-server'" ## stop: Stop development mode. stop: stop-server start-server: stop-server @echo " > $(PROJECTNAME) is available at $(ADDR)" @-$(GOBIN)/$(PROJECTNAME) 2>&1 & echo $$! > $(PID) @cat $(PID) | sed "/^/s/^/ \> PID: /" stop-server: @-touch $(PID) @-kill `cat $(PID)` 2> /dev/null || true @-rm $(PID) ## watch: Run given command when code changes. eg; make watch run="echo 'hey'" watch: @GOPATH=$(GOPATH) GOBIN=$(GOBIN) yolo -i . -e vendor -e bin -c "$(run)" restart-server: stop-server start-server ## compile: Compile the binary. compile: @-touch $(STDERR) @-rm $(STDERR) @-$(MAKE) -s go-compile 2> $(STDERR) @cat $(STDERR) | sed -e '1s/.*/\nError:\n/' | sed 's/make\[.*/ /' | sed "/^/s/^/ /" 1>&2 ## exec: Run given command, wrapped with custom GOPATH. eg; make exec run="go test ./..." exec: @GOPATH=$(GOPATH) GOBIN=$(GOBIN) $(run) ## clean: Clean build files. Runs `go clean` internally. clean: @(MAKEFILE) go-clean go-compile: go-clean go-get go-build go-build: @echo " > Building binary..." @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go build -o $(GOBIN)/$(PROJECTNAME) $(GOFILES) go-generate: @echo " > Generating dependency files..." @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go generate $(generate) go-get: @echo " > Checking if there is any missing dependencies..." @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go get $(get) go-install: @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go install $(GOFILES) go-clean: @echo " > Cleaning build cache" @GOPATH=$(GOPATH) GOBIN=$(GOBIN) go clean .PHONY: help all: help help: Makefile @echo @echo " Choose a command run in "$(PROJECTNAME)":" @echo @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /' @echo 

Source: https://habr.com/ru/post/hi461467/


All Articles