IT/Go

Golang Live Reloading command line utility

iamhyeon 2025. 1. 23. 21:37

Go 프로그램은 컴파일된 실행 파일로 실행되기 때문에 소스 코드를 수정할 때마다 프로그램을 다시 실행해야 변경 사항이 반영된다.

이를 위해 go run  명령을 사용하여 프로그램을 다시 실행해야 한다.

하지만 개발 중에는 파일이 수정될 때 자동으로 프로그램을 다시 실행해주는 도구를 사용할 수 있다.

reflex 또는 air와 같은 도구를 사용하면 파일이 변경될 때 자동으로 프로그램을 다시 실행할 수 있다.

파일 변경을 감지하고 자동으로 프로그램을 다시 실행해주므로, 개발 중에 매우 유용하다.

 


Air와 Reflex


Air는 보통 실시간 스트리밍과 관련된 라이브러리로 사용되며, 실시간으로 사용자 인터페이스를 업데이트하고 처리하는 데 도움을 준다. Air는 대개 Go 언어와 함께 사용되며, 실시간 통신에 최적화된 라이브러리로 인식된다

Reflex는 일반적으로 스트리밍보다는 웹 애플리케이션 개발에 사용되는 프레임워크일 수 있다.

예를 들어, Reflex는 리액티브 프로그래밍(reactive programming) 패러다임을 사용하여 UI를 동적으로 관리하고, 상태 변화를 처리하는 데 도움을 준다.

Air는 실시간 스트리밍 환경에서 훨씬 더 많이 사용되는 경향이 있다.

특히 Go 언어를 기반으로 한 시스템에서 자주 사용되며, 네트워크와 실시간 데이터를 처리하는 데 최적화된 구조를 가지고 있기 때문에 스트리밍 환경에서 더 많이 활용된다.

Reflex는 스트리밍보다는 다른 종류의 웹 애플리케이션에서 UI를 동적으로 처리하거나, 상태 관리에 특화된 경우가 많다


< air >

https://github.com/air-verse/air

 

GitHub - air-verse/air: ☁️ Live reload for Go apps

☁️ Live reload for Go apps. Contribute to air-verse/air development by creating an account on GitHub.

github.com

 

- live-reloading command line utility for developing Go applications

- Live Reload 오픈소스 air

 

air 특징

- 컬러 로그 출력

- 빌드 또는 바이너리 명령어 커스텀

- 제외하고 싶은 디렉토리 지정 가능

- air 시작 후 디렉토리 생성 가능

- 더 나은 빌드 프로세스

 

 

air 설치

go install github.com/air-verse/air@latest

 

 

air 설치 확인

air -v

 

 

프로젝트에 air 구성하기

- 프로젝트 루트 디렉토리에서 실행

- 프로젝트 루트 디렉토리에 .air.toml 설정 파일이 생성된다

air init

 

 

 

air 사용

프로젝트 디렉토리에서 다음 명령을 실행하여 파일이 변경될 때마다 프로그램을 다시 실행하도록 설정한다

air

 

실행한 파일  :  C:\HYEON_GitHub\10_Go\Project\project_go\api\generateKey.go

 

 

 

- air가 실행되면 tmp 폴더가 생성되고 라이브 리로딩이 시작된다.

- tmp 폴더에는 빌드된 바이너리가 저장되는 경로이다.

- 파일 수정시 자동으로 반영된 걸 확인할 수 있다.

 

 

.air.toml  파일 내용 ⬇️

root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"

[build]
  args_bin = []
  bin = "tmp\\main.exe"
  cmd = "go build -o ./tmp/main.exe ."
  delay = 1000
  exclude_dir = ["assets", "tmp", "vendor", "testdata"]
  exclude_file = []
  exclude_regex = ["_test.go"]
  exclude_unchanged = false
  follow_symlink = false
  full_bin = ""
  include_dir = []
  include_ext = ["go", "tpl", "tmpl", "html"]
  include_file = []
  kill_delay = "0s"
  log = "build-errors.log"
  poll = false
  poll_interval = 0
  post_cmd = []
  pre_cmd = []
  rerun = false
  rerun_delay = 500
  send_interrupt = false
  stop_on_error = false

[color]
  app = ""
  build = "yellow"
  main = "magenta"
  runner = "green"
  watcher = "cyan"

[log]
  main_only = false
  silent = false
  time = false

[misc]
  clean_on_exit = false

[proxy]
  app_port = 0
  enabled = false
  proxy_port = 0

[screen]
  clear_on_rebuild = false
  keep_scroll = true

다양한 설정이 가능하다.

 

[misc]
	clean_on_exit = true

로 설정한다면 air가 종료될 때 앞에 생성됐던 tmp 디렉토리가 삭제된다.

 

 

설정 적용

air -c .air.toml

 

 

더 많은 설정 파일 예시 ⬇️

 


< reflex >

 

https://github.com/cespare/reflex

 

GitHub - cespare/reflex: Run a command when files change

Run a command when files change. Contribute to cespare/reflex development by creating an account on GitHub.

github.com

- automatically running compile/lint/test tasks and for reloading your application when the code changes

- 컴파일/린트/테스트 작업을 자동으로 실행하고 코드가 변경되면 애플리케이션을 다시 로드

 

- Go 1.13 이상이 설치되어 있어야 한다.
- Go 1.16 이상이 있는 경우 최신 모듈 버전을 직접 다운로드하여 설치할 수 있다.
- Reflex는 Linux와 macOS에서만 테스트되었다.

 

reflex 설치

- 홈 디렉토리에서 실행

go install github.com/cespare/reflex@latest

 

 

reflex 실행

- 프로젝트 디렉토리에서 실행

- reflex를 사용해 Go 애플리케이션을 자동으로 리빌드하고 실행

reflex -r '\.go$' -s -- go run 파일명.go

-r '\.go$'  :  이 옵션은 .go 확장자를 가진 파일이 변경될 때마다 리로딩을 트리거한다.
-s  :  이 옵션은 리로드된 후 새로운 프로세스가 시작된 후, 이전 프로세스를 종료하도록 설정한다.
-- go run 파일명.go  :  go run 파일명.go 명령어를 실행하도록 설정한다.

 

 

추가 옵션
-d  :  파일 변경 사항을 감지하는 시간 간격을 설정할 수 있다. 예를 들어, -d 500ms로 설정하면 500ms 간격으로 파일 변경을 체크한다
-v  :  Reflex의 실행 로그를 출력한다. 리로딩의 상태를 좀 더 자세히 확인하고 싶을 때 유용하다.

reflex -r '\.go$' -d 500ms -s -v -- go run 파일명.go

 

 

 

 


refer to

https://github.com/air-verse/air

https://helicopter55.tistory.com/90

https://velog.io/@noh0907/Go-Air-%EC%BD%94%EB%93%9C-%EB%B3%80%EA%B2%BD%EC%82%AC%ED%95%AD%EC%9D%84-%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%9C%BC%EB%A1%9C-%EC%83%88%EB%A1%9C%EA%B3%A0%EC%B9%A8%ED%95%98%EA%B8%B0

 

 

'IT > Go' 카테고리의 다른 글

defer  (0) 2025.01.30
메서드 리시버  (0) 2025.01.29
Java Spring Boot 애플리케이션에서 Go REST API 호출  (0) 2025.01.22
Go 변수, 데이터타입  (0) 2024.12.26
Go 언어 개발 환경 구성  (1) 2024.12.26