Go: ์ œ์•ˆ: cmd/go: ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ •์  ์ž์‚ฐ(ํŒŒ์ผ) ํฌํ•จ ์ง€์›

์— ๋งŒ๋“  2019๋…„ 12์›” 04์ผ  ยท  176์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

์ •์  ์ž์‚ฐ ํŒŒ์ผ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํฌํ•จํ•˜๋Š” ๋งŽ์€ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ https://tech.townsourced.com/post/embedding-static-files-in-go/๊ฐ€ ๋” ๋งŽ์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ

์ด ์ž‘์—…์„ ํ•œ ๋ฒˆ ์ž˜ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ค‘๋ณต์„ ์ค„์ด๊ณ  ํŒŒ์ผ ๋ฆฌ์†Œ์Šค๋ฅผ cmd/go ๋„๊ตฌ์— ํฌํ•จํ•˜๋Š” ๊ณต์‹ ์ง€์›์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํ™ฉ์˜ ๋ฌธ์ œ์ :

  • ๋„๊ตฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค
  • go:generate ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํŒŒ์ผ์˜ ๋‘ ๋ฒˆ์งธ(์•ฝ๊ฐ„ ๋” ํฐ) ๋ณต์‚ฌ๋ณธ์œผ๋กœ git ๊ธฐ๋ก์ด ๋ถ€ํ’€๋ ค์ง‘๋‹ˆ๋‹ค.
  • go:generate๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ go install -able์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ Makefile์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ:

  • ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์ฒดํฌ์ธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค
  • *.go ํŒŒ์ผ์„ ์ „ํ˜€ ์ƒ์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(์ ์–ด๋„ ์‚ฌ์šฉ์ž์˜ ์ž‘์—… ๊ณต๊ฐ„์—๋Š” ์—†์Œ)
  • go install / go build ์ž๋™์œผ๋กœ ์ž„๋ฒ ๋”ฉ ์ˆ˜ํ–‰
  • ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ/๊ธ€๋กœ๋ธŒ๋ณ„๋กœ ์–ด๋–ค ์œ ํ˜•์˜ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ์ง€ ์„ ํƒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: []byte, func() io.Reader , io.ReaderAt ๋“ฑ).
  • ์ ์ ˆํ•œ ์œ„์น˜์— ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์••์ถ•๋œ ์ž์‚ฐ์„ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์šฉ์ž์—๊ฒŒ io.Reader ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ)? ( ํŽธ์ง‘ : ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฃผ์„ ์ฐธ์กฐ)
  • ์ปดํŒŒ์ผ ์‹œ ์ฝ”๋“œ ์‹คํ–‰ ์—†์Œ ; ๊ทธ๊ฒƒ์€ ์˜ค๋žซ๋™์•ˆ ์ง€์†๋˜์–ด ์˜จ ๋ฐ”๋‘‘ ์ •์ฑ…์ž…๋‹ˆ๋‹ค. go build ๋˜๋Š” go install ๋Š” ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ go:generate ๊ฐ€ ์„ค์น˜ ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌํ˜„ ๋ฐฉ์‹์€ //go:embed Logo logo.jpg ๋˜๋Š” ์ž˜ ์•Œ๋ ค์ง„ ํŒจํ‚ค์ง€( var Logo = embed.File("logo.jpg") )์ž…๋‹ˆ๋‹ค.

go:embed ์ ‘๊ทผ ๋ฐฉ์‹

go:embed ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ go/build -selected *.go ํŒŒ์ผ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//go:embed Logo logo.jpg

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

func Logo() *io.SectionReader

( io ํŒจํ‚ค์ง€์— ์ข…์†์„ฑ ์ถ”๊ฐ€)

๋˜๋Š”:

//go:embedglob Assets assets/*.css assets/*.js

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

var Assets interface{
     Files() []string
     Open func(name string) *io.SectionReader
} = runtime.EmbedAsset(123)

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์™„์ „ํžˆ ๊ตฌ์ฒดํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. io.Reader ๋งŒ ์ƒ์„ฑํ•˜๋Š” ์••์ถ• ํŒŒ์ผ๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž„๋ฒ ๋””๋“œ ํŒจํ‚ค์ง€ ์ ‘๊ทผ ๋ฐฉ์‹

๋‹ค๋ฅธ ๊ณ ๊ธ‰ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋งˆ๋ฒ•์˜ //go:embed ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด "embed" ๋˜๋Š” "golang.org/x/foo/embed" ํŒจํ‚ค์ง€์— Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

var Static = embed.Dir("static")
var Logo = embed.File("images/logo.jpg")
var Words = embed.CompressedReader("dict/words")

๊ทธ๋Ÿฐ ๋‹ค์Œ cmd/go๊ฐ€ embed.Foo("foo/*.js") ๋“ฑ์˜ ํ˜ธ์ถœ์„ ์ธ์‹ํ•˜๋„๋ก ํ•˜๊ณ  glob์ด ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ cmd/go์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํŠน์ • ๋นŒ๋“œ ํƒœ๊ทธ๋‚˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋Œ€์‹  ๋Ÿฐํƒ€์ž„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Perkeep(์œ„์— ๋งํฌ๋จ)์—๋Š” ํ•˜๋‚˜์˜ ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ์ฆ๋ถ„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ์ข‹์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ ค์‚ฌํ•ญ

  • ์Šคํƒ€์ผ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค(//go:embed* ๋Œ€ ๋งค์ง ํŒจํ‚ค์ง€).
  • ํŠน์ • ํŒŒ์ผ์„ ์ฐจ๋‹จํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

    • ์•„๋งˆ ../../../../../../../../../../etc/shadow ํฌํ•จ ์ฐจ๋‹จ

    • .git ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Proposal Proposal-Hold

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@robpike ์™€ ์ €๋Š” ๋ช‡ ๋…„ ์ „(์ œ์•ˆ ์ ˆ์ฐจ๊ฐ€ ์žˆ๊ธฐ ์ „) ์ œ์•ˆ์„ ํ†ตํ•ด ์ด์•ผ๊ธฐ๋ฅผ

๋‚˜๋Š” "์••์ถ• ๋Œ€ ๋น„"๋…ธ๋ธŒ์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์••์ถ•, ์••์ถ• ์ˆ˜์ค€ ๋“ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ผ๋ฐ˜ ๋ฐ”์ดํŠธ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ๋ฟ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์— ์••์ถ•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์œผ๋ฉฐ Go ์ธก์—์„œ๋Š” API๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  176 ๋Œ“๊ธ€

embedglob ๊ฐ€ ์ „์ฒด ํŒŒ์ผ ํŠธ๋ฆฌ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ผ๋ถ€ Unix ์…ธ์—์„œ ์ง€์›ํ•˜๋Š” ** ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ http.FileServer ์‚ฌ์šฉํ•˜์—ฌ HTTP๋กœ ์ž„๋ฒ ๋””๋“œ ์ž์‚ฐ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ mjibson/esc(์ด๋ฅผ ์ˆ˜ํ–‰ํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ณ ์œ ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค๊ณ  ์›๋ž˜ ๊ฒฝ๋กœ์—์„œ ์ƒˆ ๊ฒฝ๋กœ(์˜ˆ: "/js/bootstrap.min.js": "/js/bootstrap.min.827ccb0eea8a706c4c34a16891f84e7b.js" ๋กœ ๋งต์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž์ฒด ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ href="{{ static_path "/css/bootstrap.min.css" }}" ์™€ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ์—์„œ ์ด ๋งต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ค ํŒŒ์ผ์ด ํ”„๋กœ๊ทธ๋žจ์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

//go:embed ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋˜ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ๋ณต์žก์„ฑ๋„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ typecheckํ•˜๋ ค๋ฉด ๋งค์ง ์ฃผ์„์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "ํฌํ•จ ํŒจํ‚ค์ง€" ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ •์  ๋ถ„์„์— ๋” ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

(์—ฌ๊ธฐ์„œ ๊ทธ๋ƒฅ ํฐ ์†Œ๋ฆฌ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

@opennota ,

http.FileServer ์‚ฌ์šฉํ•˜์—ฌ ํฌํ•จ๋œ ์ž์‚ฐ์„ HTTP๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์œ„์˜ ์ฒซ ๋ฒˆ์งธ ๋งํฌ๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ( 2011๋…„ Go 1 ์ด์ „) ํŒจํ‚ค์ง€์ด๋ฉฐ http.FileServer ์‚ฌ์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. https://godoc.org/perkeep.org/pkg/fileembed#Files.Open

@cepare ,

//go:embed ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋˜ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ๋ณต์žก์„ฑ๋„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ typecheckํ•˜๋ ค๋ฉด ๋งค์ง ์ฃผ์„์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "ํฌํ•จ ํŒจํ‚ค์ง€" ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ •์  ๋ถ„์„์— ๋” ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ cmd/go์˜ ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ godoc์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋ฌธ์„œํ™” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@bradfitz - https://github.com/golang/go/issues/3035 ๋ฅผ ๋‹ซ์œผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@agnivade , ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋ชป ์ฐพ๊ฒ ์–ด์š”. ์ง€๊ธˆ์€ ์—ด์–ด๋‘๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๋ด…์‹œ๋‹ค.

๋งค์ง ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์œ ํ˜• ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ์ž๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ƒ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://play.golang.org/p/RtHlKjhXcda.

(์—ฌ๊ธฐ์—์„œ ์ฐธ์กฐ๋œ ์ „๋žต์ž…๋‹ˆ๋‹ค: https://groups.google.com/forum/#!topic/golang-nuts/RDA9Hag8RZw/discussion)

๋‚ด๊ฐ€ ๊ฐ€์ง„ ํ•œ ๊ฐ€์ง€ ๊ด€์‹ฌ์‚ฌ๋Š” ๊ฐœ๋ณ„ ๋˜๋Š” ๋ชจ๋“  ์ž์‚ฐ์ด ๋„ˆ๋ฌด ์ปค์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์•ก์„ธ์Šค ์‹œ๊ฐ„ ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ ๋˜๋Š” ์ผ๋ถ€ ์ค‘๊ฐ„ ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ๋นŒ๋“œ ํƒœ๊ทธ ๋˜๋Š” ํŒŒ์ผ๋ณ„ ์•ก์„ธ์Šค ์˜ต์…˜์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์€ (๋ฌผ๋ก  ๋‚ด ์ž์‹ ์˜ ๊ตฌํ˜„๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค :)) ๋ชจ๋“  ์ž„๋ฒ ๋””๋“œ ์ž์‚ฐ์„ ์ œ๊ณตํ•˜๋Š” http.FileSystem ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด typechecker๋ฅผ ๋‹ฌ๋ž˜๊ธฐ ์œ„ํ•ด ๋งค์ง ์ฃผ์„์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  http์—์„œ ์ž์‚ฐ์„ ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ ๋ชฉ์ (http.Dir)์„ ์œ„ํ•ด ๋Œ€์ฒด ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ตœ์ข… ๊ตฌํ˜„์€ ๋งค์šฐ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. http.FileSystem์€ ํŒŒ์ผ ์ฝ๊ธฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””๋ ‰ํ† ๋ฆฌ ๋‚˜์—ด์—์„œ๋„ ๊ฝค ๋งŽ์€ ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด ๋ชจ๋“  glob์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋งค์ง ์ฃผ์„์ด๋‚˜ ๋ฌด์—‡์ด๋“  ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@AlexRouSg ์ด ์ œ์•ˆ์€ ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์— ์ง์ ‘ ํฌํ•จํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ํŒŒ์ผ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ปค์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š๋Š” ํŒŒ์ผ์—๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋„๊ตฌ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@ianlancetaylor , ๋‚ด ์ƒ๊ฐ์— @AlexRouSg ๊ฐ€ ๋งŒ๋“  ์ฐจ์ด์ ์€ ํŒŒ์ผ์„ ์ „์—ญ []byte (ํŽ˜์ด์ง•ํ•  ์ˆ˜ ์—†๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ)๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ Open ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” *io.SectionReader Open ํ˜ธ์ถœ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋””์Šคํฌ(์‹คํ–‰ ํŒŒ์ผ์—์„œ)์— ์žˆ์Šต๋‹ˆ๋‹ค. ( http.File ๋˜๋Š” http.FileSystem ๋ฅผ cmd/go ๋˜๋Š” ๋Ÿฐํƒ€์ž„์— ๊ตฝ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค... net/http๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

@bradfitz ๋ชจ๋‘ http.File ์ž์ฒด๋Š” http ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๊ธฐ์ˆ ์  ์ข…์†์„ฑ์ด ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. Stat ๋ฐ Readdir ๋ฉ”์†Œ๋“œ ๋ชจ๋‘ ์ด๋Ÿฌํ•œ ์ž์‚ฐ์— ๋งค์šฐ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  Open ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค Stat

@urandom ํ•˜์ง€๋งŒ "http.File" ์ด๋ฆ„(https://play.golang.org/p/-r3KjG1Gp-8)์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ ๋Š” http.FileSystem์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@robpike ์™€ ์ €๋Š” ๋ช‡ ๋…„ ์ „(์ œ์•ˆ ์ ˆ์ฐจ๊ฐ€ ์žˆ๊ธฐ ์ „) ์ œ์•ˆ์„ ํ†ตํ•ด ์ด์•ผ๊ธฐ๋ฅผ

๋‚˜๋Š” "์••์ถ• ๋Œ€ ๋น„"๋…ธ๋ธŒ์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์••์ถ•, ์••์ถ• ์ˆ˜์ค€ ๋“ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ผ๋ฐ˜ ๋ฐ”์ดํŠธ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ๋ฟ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์— ์••์ถ•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์œผ๋ฉฐ Go ์ธก์—์„œ๋Š” API๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ:

  • ์ž„๋ฒ ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ ์™ธ๋ถ€์— ํŒŒ์ผ์„ ์ž„๋ฒ ๋“œํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ํŒŒ์ผ์ด ๋ชจ๋“ˆ zip ํŒŒ์ผ์˜ ์ผ๋ถ€์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ, ๋Œ€์†Œ๋ฌธ์ž ์ถฉ๋Œ ๋“ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•ฉ๊ณ„๋ฅผ ๊นจ์ง€ ์•Š๊ณ  zip ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ( //go:embed ์ฃผ์„์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ) ๋˜๋Š” ํŠน์ • ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ( static ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ)์— ์ž„๋ฒ ๋”ฉ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒจํ‚ค์ง€์™€ ํฌํ•จ๋œ ํŒŒ์ผ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“  /etc/shadow ๋˜๋Š” .git ํฌํ•จ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ชจ๋“ˆ zip์— ํฌํ•จ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ go ๋ช…๋ น์˜ ๋ฒ”์œ„๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฑฑ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์•„๋งˆ๋„ ํ•˜๋‚˜์˜ ๊ณต์‹ ์†”๋ฃจ์…˜์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” go_embed_data ๋ฐ go-bindata (๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€ ํฌํฌ๊ฐ€ ์žˆ์Œ)์— ์ต์ˆ™ํ•˜๋ฉฐ ์ด๊ฒƒ์ด ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŠนํžˆ static ๋˜๋Š” embed ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ํŒŒ์ผ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋Š” ๊ทธ๊ฒƒ์„ ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ๋ชจ๋“ˆ ์™ธ๋ถ€์— ๋˜๋Š” GOPATH์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€ ์™ธ๋ถ€์— ์–ด๋–ค ๊ฒƒ๋„ ํฌํ•จํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŠนํžˆ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ฃผ์„์˜ ํŒฌ์€ ์•„๋‹ˆ์ง€๋งŒ ์ปดํŒŒ์ผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์˜์‚ฌ ํŒจํ‚ค์ง€๋„ ์•ฝ๊ฐ„ ์ด์ƒํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์ผ์ข…์˜ embed ์ตœ์ƒ์œ„ ์„ ์–ธ์„ ์–ธ์–ด์— ์‹ค์ œ๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๋กœ์ปฌ ๊ฒฝ๋กœ๋งŒ ์ง€์›ํ•˜๋ฉฐ ํ• ๋‹นํ•  ์ด๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

embed ui "./ui/build"

func main() {
  file, err := ui.Open("version.txt")
  if err != nil {
    panic(err)
  }
  version, err = ioutil.ReadAll(file)
  if err != nil {
    panic(err)
  }
  file.Close()

  log.Printf("UI Version: %s\n", bytes.TrimSpace(version))
  http.ListenAndServe(":8080", http.EmbeddedDir(ui))
}

ํŽธ์ง‘: @jayconrod, ๋‹น์‹ ์ด ์ €๋ฅผ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/35950#issuecomment -561703346์—์„œ ํ™•์žฅํ•˜๋ ค๋ฉด ๋…ธ์ถœ๋œ API์— ๋Œ€ํ•œ ํผ์ฆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ []byte , string ๋ฐ Read -ish ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ []byte ( io.Reader , io.SectionReader ๋“ฑ ํฌํ•จ)๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋Š” (1) ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, (2) ๋ณ€๊ฒฝ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜, (3) []byte ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ string ๋กœ ๋…ธ์ถœํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ํฌํ•จ๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์ฝ”๋“œ๋Š” ๊ฒฐ๊ตญ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•œ API ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

route (3): []byte ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์› ๋ฐฐ์—ด์— ์ฝ๊ธฐ ์ „์šฉ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ €๋ ดํ•˜๊ฒŒ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ []byte ๋ฐ string ์™€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆ๋ณ€์„ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ์†์‹ค์ด ํฌ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํˆด์ฒด์ธ ์ง€์›์ด (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ) ๊ธฐ์กด codegen ํŒจํ‚ค์ง€ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(ํƒ€์‚ฌ codegen ํŒจํ‚ค์ง€๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œ๋œ DATA ๊ธฐํ˜ธ๊ฐ€ ํฌํ•จ๋œ ์ผ๋ฐ˜ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ํ•ด๋‹น ๊ธฐํ˜ธ๋ฅผ string ํ˜•์‹์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ์งง์€ ์•„์น˜๋ณ„ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. s ๋ฐ []byte s. ๋‚˜๋Š” ํŠน๋ณ„ํžˆ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  CL 163747์„ ์ž‘์„ฑํ–ˆ์ง€๋งŒ, ์–ด๋–ค codegen ํŒจํ‚ค์ง€์—๋„ ํ†ตํ•ฉํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ถˆ๋ณ€์„ฑ ์ธก๋ฉด์—์„œ ๋ฌด์—‡์„ ๋งํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. io.Reader ์ด๋ฏธ ๋ถˆ๋ณ€์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ „์ฒด ์š”์ ์ž…๋‹ˆ๋‹ค. Read(buf) ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด _you_๊ฐ€ ์ œ๊ณตํ•œ ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ buf ์ฆ‰์˜ ๋‚ด๋ถ€์— ์ œ๋กœ ํšจ๊ณผ๊ฐ€ ํ›„ io.Reader .

@DeedleFake์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ๋ฒ• ๊ฐ™์€ []byte ๋ฐฐ์—ด๋กœ ๊ฒŒ์ž„์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์‚ฌ์šฉ์ž ์ œ๊ณต ๋ฒ„ํผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์ฃผ๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. DTrace ์†Œ์Šค ์ฝ”๋“œ(์ž„๋ฒ ๋””๋“œ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ \n๊ณผ \r\n์˜ ์ฐจ์ด์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด DTrace์—์„œ ๋ฉ์ฒญํ•œ ์ผ์ธ์ง€ ์•„๋‹Œ์ง€ ๋…ผ์Ÿํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์š”์ ์„ ๋ฒ—์–ด๋‚˜๊ณ  ์˜ค๋Š˜๋‚ ์˜ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.)

๋ฐฑํ‹ฑ ๋ฌธ์ž์—ด์ด ์†Œ์Šค์— ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์— ๊ด€๊ณ„์—†์ด ๋‘˜ ๋‹ค \n์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, DTrace๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด go-generate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ go ๋ช…๋ น์— ํฌํ•จ ํŒŒ์ผ์ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ CR/CRLF ์ฒ˜๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ต์…˜์ด ๋งค์šฐ ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์žก์•˜๋‹ค.

์••์ถ•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ "ํŒŒ์ผ ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ณต์‚ฌ"์—์„œ ๋ฉˆ์ถ”๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. CR/CRLF ์ •๊ทœํ™”, ์œ ๋‹ˆ์ฝ”๋“œ ์ •๊ทœํ™”, gofmt'ing, ๋‹ค๋ฅธ ๊ณณ์— ์†ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ. ์›ํ•˜๋Š” ์ •ํ™•ํ•œ ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ์ฒดํฌ์ธํ•˜์‹ญ์‹œ์˜ค. (๋งŒ์•ฝ ๋‹น์‹ ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ๊ทธ๋Œ€๋กœ ๋‘˜ ์ˆ˜ ์—†๋‹ค๋ฉด, ์•„๋งˆ๋„ gzip์œผ๋กœ ์••์ถ•๋œ ๋‚ด์šฉ์„ ์ฒดํฌ์ธํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— ๊ทธ๊ฒƒ๋“ค์„ gunzip์œผ๋กœ ๋ฌถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š” _๋งŽ์€_ ๊ฐœ์˜ ํŒŒ์ผ ๋ญ‰์น˜๊ธฐ ๋…ธ๋ธŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 0์—์„œ ๋ฉˆ์ถ”์ž.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ์ƒˆ๋กœ์šด ์˜ˆ์•ฝ๋œ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ๋„์ž…ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(2014๋…„์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์ง€ ์•Š์•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์•„๋งˆ ๋„ˆ๋ฌด ๋Šฆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)
๋”ฐ๋ผ์„œ ์ผ์ข…์˜ ์˜ตํŠธ์ธ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

runtime.Files ์œ ํ˜•์„ ์ •์˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ฐ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//go:embed *.html (or static/* etc)
var files runtime.Files

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋Ÿฐํƒ€์ž„์— files.Open์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ interface { io.ReadSeeker; io.ReaderAt } ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. var๋Š” ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ•œ ํŒจํ‚ค์ง€๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ํฌํ•จ๋œ ํŒŒ์ผ์„ ๋‘˜๋Ÿฌ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์€ TBD์ด์ง€๋งŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒํผ์€ ์ถฉ๋ถ„ํ•ด์•ผ ํ•˜๋ฉฐ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ๋‹จ์ˆœํ™”๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!)

์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“  Bazel๊ณผ Gazelle๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Gazelle์ด ์ฃผ์„์„ ์ธ์‹ํ•˜๊ณ  globs๋ฅผ ๋งํ•˜๋Š” Bazel ๊ทœ์น™์„ ์ž‘์„ฑํ•˜๋„๋ก ํ•œ ๋‹ค์Œ ๋นŒ๋“œ์— ํฌํ•จํ•  ์ถ”๊ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋„๊ตฌ(go ๋„๊ตฌ embedgen ๋˜๋Š” ๋ฌด์—‡์ด๋“ )๋ฅผ ๋…ธ์ถœํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(go ๋ช…๋ น์€ ์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ถ”๊ฐ€ ํŒŒ์ผ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ). ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ munging์ด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ž…๋‹ˆ๋‹ค. ์ €๋ฅผ ์œ„ํ•œ ์Šคํ† ํผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ „์ฒ˜๋Ÿผ go generate๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ ๊ธฐ๋Šฅ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ munging๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ž์ฒด์—์„œ) -- go cmd๊ฐ€ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜์—ฌ ํฌํ•จํ•˜๊ธฐ ์ „์— ํŒŒ์ผ์„ ์‚ฌ์ „ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ๋žŒ๋“ค์€ ์›ํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ dos2unix ๊ตฌํ˜„, ์••์ถ• ๋“ฑ๊ณผ ๊ฐ™์€ ์ค€ํ‘œ์ค€ ํ•„ํ„ฐ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž„๋ฒ ๋””๋“œ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฐ„์— ๋ชจ๋“  ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐ€์ •์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ์ ์„ ์œ„ํ•œ ์ž„์‹œ ๊ธฐ๋ณธ ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ์ƒˆ๋กœ์šด ์˜ˆ์•ฝ๋œ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ๋„์ž…ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [...] ์ผ์ข…์˜ ์˜ตํŠธ์ธ ์ฃผ์„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

runtime/embed ์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์˜ตํŠธ์ธ ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

io.Read ์ ‘๊ทผ ๋ฐฉ์‹์€ strings.Contains (์˜ˆ: cmd/go/internal/cfg ) ๋˜๋Š” , ๋น„ํŒ์ ์œผ๋กœ template.Parse .

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ํ˜ธ์ถœ์ž๊ฐ€ ์ „์ฒด blob์„ (์•„๋งˆ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ) string ๋˜๋Š” io.ReaderAt ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ์ผ๋ฐ˜์ ์ธ runtime.Files ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. runtime.Files.Open ์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ReadString() string ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ์ข…์˜ ์˜ตํŠธ์ธ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go.mod ํŒŒ์ผ์˜ go ๋ฒ„์ „์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1.15 ์—๋Š” static ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜๊ณ  1.15 ์ด์ƒ์—๋Š” ํฌํ•จ๋œ ์ž์‚ฐ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

(ํ•˜์ง€๋งŒ GOPATH ๋ชจ๋“œ์—์„œ๋Š” ์‹ค์ œ๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” "์••์ถ• ๋Œ€ ๋น„"๋…ธ๋ธŒ์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์••์ถ•, ์••์ถ• ์ˆ˜์ค€ ๋“ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ผ๋ฐ˜ ๋ฐ”์ดํŠธ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ˆœํ•จ์„ ์œ„ํ•œ ์ถ”์ง„๋ ฅ์„ ๋†’์ด ํ‰๊ฐ€ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://tech.townsourced.com/post/embedding-static-files-in-go/#comparison์— ๋‚˜์—ด๋œ ๋„๊ตฌ 14๊ฐœ ์ค‘ 12๊ฐœ๋Š” ์••์ถ•์„ ์ง€์›ํ•˜๋ฉฐ ์ด๋Š” ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์™ธ๋ถ€์—์„œ ์‚ฌ์ „ ๋นŒ๋“œ ๋‹จ๊ณ„๋กœ ์••์ถ•์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ ์—ฌ์ „ํžˆ 1) ์••์ถ•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 2) ์ผ์ข…์˜ assets.zip ๋ฉ์–ด๋ฆฌ๋ฅผ vcs์— ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์••์ถ•์„ ์ทจ์†Œํ•˜๊ธฐ ์œ„ํ•ด Embed API ์ฃผ๋ณ€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์–ด๋Š ์‹œ์ ์—์„œ ์ด์ต์ด ๋ฌด์—‡์ธ์ง€ ์ „ํ˜€ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์ œ์•ˆ์„œ์— ๋‚˜์—ด๋œ ์„ธ ๊ฐ€์ง€ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์ฒดํฌ์ธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค
  • go install / go build ์ž๋™์œผ๋กœ ์ž„๋ฒ ๋”ฉ ์ˆ˜ํ–‰
  • ์ ์ ˆํ•œ ๊ฒฝ์šฐ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์••์ถ•๋œ ์ž์‚ฐ ์ €์žฅ

์ด ์ค‘ ๋‘ ๋ฒˆ์งธ๋ฅผ "์ž„๋ฒ ๋”ฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ"์œผ๋กœ ์ฝ๋Š”๋‹ค๋ฉด ์••์ถ• ํŒŒ์ผ์„ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์„ธ ๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ˆ˜์ค€์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ = ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ ์ˆ˜์ค€์ด ๋” ์„ธ๋ถ„ํ™”๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” Go ์ฝ”๋“œโ€ ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ _static ์™€ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

โ€  ๋˜๋Š” ๊ทธ๋ ‡๋‹ค๋ฉด ์ปดํŒŒ์ผํ•  Go ์ฝ”๋“œ ๋Œ€์‹  ์ด๋ฆ„์ด ".go"๋กœ ๋๋‚˜๋Š” ์ž„์˜์˜ ๋ฐ”์ดํŠธ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๊ทธ๊ฒƒ์ด ํ•˜๋‚˜์˜ ํŠน๋ณ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ผ๋ฉด, ๋กœ์ง์€ ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ›Œ์ฉ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์ง ์ž„๋ฒ ๋“œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด embed.Open("img/logo.svg") ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ž์‚ฐ ํŠธ๋ฆฌ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ง์€ ์ถฉ๋ถ„ํžˆ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. []byte ๋กœ ์‰ฝ๊ฒŒ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ Reader ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋ฉ‹์ง„ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  init ๋™์•ˆ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์••์ถ• ํ•ด์ œ ๋˜๋Š” http.FileSystem ์ƒ์„ฑ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Windows์—๋Š” ์ž์‚ฐ ํฌํ•จ์„ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ํ˜•์‹์ด ์—†์Šต๋‹ˆ๋‹ค. Windows ์‹คํ–‰ ํŒŒ์ผ์„ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์˜ ์ข…๋ฅ˜์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๊นŒ?

gitfs๋ฅผ ์žŠ์ง€ ๋งˆ์„ธ์š” ๐Ÿ˜‚

์˜ˆ๋ฅผ ๋“ค์–ด์ด ์ด๋™ ๋นŒ๋“œ / ๋งํฌ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜์—†๋Š” ์ด์œ ๋Š” ... ๊ฑฐ๊ธฐ์— go build -embed example=./path/example.txt ์ผ๋ถ€ ํŒจํ‚ค์ง€ ๊ทธ๊ฒƒ์ด (์— ๋…ธ์ถœํ•˜๋Š” ์•ก์„ธ์Šค ์˜ˆ๋ฅผ ๋“ค์–ด embed.File("example") , ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  go:embed ?

ํ•˜์ง€๋งŒ ์ฝ”๋“œ์— ์Šคํ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@egonelbre go build -embed ๋ฌธ์ œ์ ์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ํˆฌ๋ช…ํ•˜๊ณ  ์ž๋™์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด go install ๋˜๋Š” go get ๋ช…๋ น์€ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ค‘๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@bradfitz Packr ๋ณด๋‹ค https://github.com/markbates/pkger ๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ž‘์—…์„ ์œ„ํ•ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

func run() error {
    f, err := pkger.Open("/public/index.html")
    if err != nil {
        return err
    }
    defer f.Close()

    info, err := f.Stat()
    if err != nil {
        return err
    }

    fmt.Println("Name: ", info.Name())
    fmt.Println("Size: ", info.Size())
    fmt.Println("Mode: ", info.Mode())
    fmt.Println("ModTime: ", info.ModTime())

    if _, err := io.Copy(os.Stdout, f); err != nil {
        return err
    }
    return nil
}

๋˜๋Š” ํŠน์ • ๋นŒ๋“œ ํƒœ๊ทธ๋‚˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋Œ€์‹  ๋Ÿฐํƒ€์ž„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Perkeep(์œ„์— ๋งํฌ๋จ)์—๋Š” ํ•˜๋‚˜์˜ ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ์ฆ๋ถ„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ์ข‹์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

mjibson/esc๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์›น ์•ฑ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ถ์˜ ์งˆ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํ™ฉ์˜ ๋ฌธ์ œ์ :

  • go:generate ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํŒŒ์ผ์˜ ๋‘ ๋ฒˆ์งธ(์•ฝ๊ฐ„ ๋” ํฐ) ๋ณต์‚ฌ๋ณธ์œผ๋กœ git ๊ธฐ๋ก์ด ๋ถ€ํ’€๋ ค์ง‘๋‹ˆ๋‹ค.

๋ชฉํ‘œ:

  • ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์ฒดํฌ์ธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค

์Œ, ์ด ๋ถ€๋ถ„์€ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ .gitignore ํŒŒ์ผ ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ทธ๋žฌ๋Š”๋ฐ...

๋”ฐ๋ผ์„œ Go๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ go build ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž์ฒด "๊ณต์‹" ํฌํ•จ ๋„๊ตฌ๋ฅผ ๊ฐ–๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๊ทœ์น™์œผ๋กœ ๋ฌด์‹œํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋œ ๋งˆ๋ฒ•์ ์ธ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด Go ๋ฒ„์ „๊ณผ ์—ญํ˜ธํ™˜ ๊ฐ€๋Šฅ).

๋‚˜๋Š” ๋‹จ์ง€ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ/์ƒ๊ฐ์„ ํฌ๊ฒŒ ํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ์ „๋ฐ˜์ ์œผ๋กœ ์ œ์•ˆ๋œ ์•„์ด๋””์–ด๊ฐ€ ์‚ฌ์‹ค ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๐Ÿ™‚

๋˜ํ•œ, ์ดํ›„ //go:generate ์ง€์‹œ๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค go build ์˜ ๋™์ž‘ go build ๋น„ํŠธ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : //go:embed ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฒƒ๋ฅผ์œ„ํ•œ //go:generate go generate ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ( //go:generate ๋Š” ๋นŒ๋“œ์— ํ•„์š”ํ•œ .go ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ go get ํ๋ฆ„์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

//go:generate ๋Š” ๋นŒ๋“œ์— ํ•„์š”ํ•œ .go ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ go get ํ๋ฆ„์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„๊ณผ ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ๋ฆ„์— ์ต์ˆ™ํ•ด์ง€๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€ go generate ์™„์ „ํžˆ ๊ฐœ๋ฐœ์šฉ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@bradfitz http.FileSystem ์ž์ฒด๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์—์„œ http.File ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ Open ํ•จ์ˆ˜ ์ฃผ์œ„์— ๋ž˜ํผ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์œ ํ˜•์„ http.File ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” stdlib http ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http.FileSystem

@andreynering //go:generate ์™€ //go:embed ๋Š” ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์‹œ ์›ํ™œํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด cgo๊ฐ€ go build ์ผ๋ถ€๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” "์••์ถ• ๋Œ€ ๋น„"๋…ธ๋ธŒ์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์••์ถ•, ์••์ถ• ์ˆ˜์ค€ ๋“ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์€ ์ผ๋ฐ˜ ๋ฐ”์ดํŠธ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ˆœํ•จ์„ ์œ„ํ•œ ์ถ”์ง„๋ ฅ์„ ๋†’์ด ํ‰๊ฐ€ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://tech.townsourced.com/post/embedding-static-files-in-go/#comparison์— ๋‚˜์—ด๋œ ๋„๊ตฌ 14๊ฐœ ์ค‘ 12๊ฐœ๋Š” ์••์ถ•์„ ์ง€์›ํ•˜๋ฉฐ ์ด๋Š” ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด ์ถ”๋ก ์— ๋™์˜ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์••์ถ•์€ ๋Œ€์ฒด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ๋นŒ๋“œ ์ „์— ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„์† ๋นŒ๋“œ์—์„œ ์„ฑ๋Šฅ์„ ๊ฐ์†Œ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์ด ์ œ์•ˆ์— ์••์ถ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚ฎ์€ ๋นŒ๋“œ ์‹œ๊ฐ„์€ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด Go๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„๋ช…ํ•œ ๋ถ€๊ฐ€๊ฐ€์น˜์ด๋ฉฐ ์••์ถ•์€ ์Šคํ† ๋ฆฌ์ง€/์ „์†ก ๊ณต๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด CPU ์‹œ๊ฐ„์„ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ Go ํŒจํ‚ค์ง€๊ฐ€ go build ์—์„œ ์••์ถ•์„ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋นŒ๋“œ ์ค‘์— ๋‹จ์ˆœํžˆ ์ž์‚ฐ์„ ๋ณต์‚ฌํ•˜์—ฌ ์ถ”๊ฐ€๋œ ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์••์ถ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์„ค๊ณ„๊ฐ€ ์„ค๊ณ„์ƒ ์••์ถ• ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ–ฅํ›„ ํ™•์žฅ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š๋Š” ํ•œ, ์ผ๋ถ€๋Š” ๋ถˆํ•„์š”ํ•œ ํ—ค์ง•์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ์ด ์••์ถ• ์—†์ด๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์••์ถ•์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ 100MB์—์„œ 50MB๋กœ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ผญ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋”œ๋ธŒ๋ ˆ์ด์ปค๋Š” ์•„๋‹™๋‹ˆ๋‹ค. . ํŠนํžˆ ๋Œ€๋ถ€๋ถ„์˜ "๋ฌด๊ฑฐ์šด" ์ž์‚ฐ์ด ์ด๋ฏธ ๊ฝค ์ž˜ ์••์ถ•๋œ JPEG ๋˜๋Š” PNG์™€ ๊ฐ™์€ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์••์ถ•์„ ์œ ์ง€ํ•˜๊ณ  ์‹ค์ œ๋กœ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋†“์น˜๊ณ  ์žˆ๋Š” ์••์ถ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (๊ทธ๋ฆฌ๊ณ  ๊ณผ๋„ํ•œ ๋น„์šฉ ์—†์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ)

์œ„์˜ @sakjur ์˜๊ฒฌ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์••์ถ•์ด ๋‚˜์—๊ฒŒ ์ง๊ต์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์‚ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋˜๋Š” ๋ฆด๋ฆฌ์Šค ์•„์นด์ด๋ธŒ๋ฅผ ์••์ถ•ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Go์˜ Go ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ž์‚ฐ ์—†์ด ์ˆ˜์‹ญ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์— ์‰ฝ๊ฒŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ.

@mvdan ๋‚ด ์šฐ๋ ค ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ์ž„๋ฒ ๋”ฉ์ด ๋‹ค๋ฅธ ์‚ฌ์ „ ์ฒ˜๋ฆฌ(์ถ•์†Œ, ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ, ๋ฐ์ดํ„ฐ ์••์ถ•, ์ด๋ฏธ์ง€ ํฌ๋Ÿฐ์นญ, ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •, ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ)์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์„ ๋•Œ ๊ฝค ์ž์ฃผ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. html/template ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์›น์‚ฌ์ดํŠธ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ตญ ์ผ์ข…์˜ "Makefile"์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์ „ ์ฒ˜๋ฆฌ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์—…๋กœ๋“œํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ฃผ์„๋ณด๋‹ค ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ๋” ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์šฐ๋ ค ์ค‘ ํ•˜๋‚˜๋Š” ์ž„๋ฒ ๋”ฉ์ด ์ถ•์†Œ, ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ, ๋ฐ์ดํ„ฐ ์••์ถ•, ์ด๋ฏธ์ง€ ํฌ๋Ÿฐ์นญ, ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •, ์Šคํ”„๋ผ์ดํŠธ ์‹œํŠธ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ฒ˜๋ฆฌ์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์„ ๋•Œ ๊ฝค ์ž์ฃผ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. html/template๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์›น์‚ฌ์ดํŠธ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์••์ถ•์˜ ํ•„์š”์„ฑ์€ ๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ์ด ์••์ถ• ์—†์ด๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์••์ถ•์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ 100MB์—์„œ 50MB๋กœ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ผญ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋”œ๋ธŒ๋ ˆ์ด์ปค๋Š” ์•„๋‹™๋‹ˆ๋‹ค. .

๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋Š” ๋งŽ์€ go ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(https://github.com/golang/go/issues/6853). Go๋Š” DWARF ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์••์ถ•ํ•˜์—ฌ ํŠนํžˆ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ๋งํฌ ์‹œ๊ฐ„์— ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ (https://github.com/golang/go/issues/11799, https://github.com/golang/go/) ๋ฌธ์ œ/26074). ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ทธ ๊ธฐํšŒ๋ฅผ ์žก์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

GOPATH ๋ชจ๋“œ์—์„œ๋Š” ์‹ค์ œ๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ GOPATH ๋ชจ๋“œ์— ์žˆ๋Š” ๊ฒฝ์šฐ Go ํŒ€์ด GOPATH์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ํŒจ๋ฆฌํ‹ฐ๋ฅผ ์˜์›ํžˆ ์ˆ˜ํ–‰ํ•  ๊ณ„ํš์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํžˆ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? GOPATH์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ฒดํฌ์„ฌ db๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ, ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ์ข…์†์„ฑ ๋‹ค์šด๋กœ๋“œ, ์˜๋ฏธ ์ฒด๊ณ„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„์ „ ๊ด€๋ฆฌ).

@bcmills๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด go.mod ํŒŒ์ผ์— ์ •์  ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ด ๊ธฐ๋Šฅ์ด <=go1.14 ์ ˆ์ด ์žˆ๋Š” go.mod ํŒŒ์ผ์—์„œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Go 1.15์—์„œ ์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์  ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฒค๋” ๋””๋ ‰ํ† ๋ฆฌ์™€ _test.go ๊ทœ์•ฝ์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋“ค์ด Go์™€ ์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ณต๊ธ‰์—…์ฒด ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ์˜ต์…˜์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ _test.go ๊ทœ์น™์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•œ ๊ธฐ์–ต์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Go๊ฐ€ _test.go ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Go์—์„œ์˜ ํ…Œ์ŠคํŠธ๋Š” ์˜ค๋Š˜๋‚  ๋งŽ์ด ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ static ๋ณด๋‹ค ๋œ ์ผ๋ฐ˜์ ์ธ ์ด๋ฆ„์ด ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์œผ๋ฏ€๋กœ ๊ธฐ์กด ๋””๋ ‰ํ† ๋ฆฌ(vendor ๋ฐ _test.go์™€ ์œ ์‚ฌ)๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งˆ๋ฒ• ๊ฐ™์€ ์ฃผ์„์— ๋น„ํ•ด ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž ์žฌ์ ์œผ๋กœ ์ถฉ๋Œ์ด ์ ์€ ์ด๋ฆ„์˜ ์˜ˆ:

  • _embed - _test.go ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • go_binary_assets
  • .gobin ๋Š” .git ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • runtime_files - runtime.Files ๊ตฌ์กฐ์ฒด์™€ ์ผ์น˜ํ•˜๋„๋ก

๋งˆ์ง€๋ง‰์œผ๋กœ vendor ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ Go 1.5์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ƒˆ๋กœ์šด ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”? ๐Ÿ˜‚

mmap-readonly []byte ๋…ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ OS์— ์˜ํ•ด ํŽ˜์ด์ง•๋œ ์‹คํ–‰ ํŒŒ์ผ์˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์›์‹œ ์•ก์„ธ์Šค์ž…๋‹ˆ๋‹ค. bytes.NewReader ๋งŒ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ ์œ„์— ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ด์œ ๋กœ๋“  ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ReaderAt ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ReadSeeker . ํ›„์ž๋Š” ์ „์ž์—์„œ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์˜คํ”„์…‹์„ ๋ณดํ˜ธํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๋ง์น˜๊ธฐ ์œ„ํ•ด ๋ฎคํ…์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ์ด ์••์ถ• ์—†์ด๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์••์ถ•์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ 100MB์—์„œ 50MB๋กœ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ผญ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋”œ๋ธŒ๋ ˆ์ด์ปค๋Š” ์•„๋‹™๋‹ˆ๋‹ค. .

๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋Š” ๋งŽ์€ go ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(#6853). Go๋Š” ์ด์ง„ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด DWARF ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ๋งํฌ ์‹œ๊ฐ„์— ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„(#11799, #26074). ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ทธ ๊ธฐํšŒ๋ฅผ ์žก์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ณต์ •ํ•œ ์ง€์ ์ด๋ฉฐ ๋‚ด ์ฃผ์žฅ์ด ํŒŒ์ผ ํฌ๊ธฐ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ถ€์ฃผ์˜์— ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด ์˜๋„๊ฐ€ ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•  ์••์ถ• ์—†์ด ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๋” ์ผ์น˜ํ•˜๋ฉฐ, ์žฅ๊ธฐ์ ์œผ๋กœ ์ ์ ˆํ•˜๊ฒŒ ๋Š๊ปด์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ์••์ถ•์„ ์ ์ ˆํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‚ฐ์€ ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ถ€ํ’€์–ด ์˜ค๋ฅด๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์„ค์น˜/๊ฐ€์ ธ์˜จ ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„์—์„œ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋นŒ๋“œ ์„ฑ๋Šฅ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ž์‚ฐ ์••์ถ•์„ ๋นŒ๋“œ ํ”Œ๋ž˜๊ทธ๋กœ ๋งŒ๋“ค๊ณ  ๋นŒ๋“œ ํฌ๊ธฐ์™€ ์‹œ๊ฐ„ ๊ฐ„์˜ ํƒ€ํ˜‘์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ๋นŒ๋”์—๊ฒŒ ๋งก๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์••์ถ•์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๊ฐ€๊นŒ์šด ๊ฒฐ์ •์ด ๋‚ด๋ ค์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Otoh, ์ด๊ฒƒ์€ ๊ฐœ๋ฐœ๊ณผ ์ƒ์‚ฐ ๊ฐ„์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ์ฆ๊ฐ€๋œ ํ‘œ๋ฉด์ ์„ ์ƒ์„ฑํ•  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ฉฐ ์˜นํ˜ธํ•˜๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ž์‚ฐ ์ž„๋ฒ ๋”ฉ ๋„๊ตฌ๋Š” -tags dev ๋นŒ๋“œํ•  ๋•Œ ์ž์‚ฐ ํŒŒ์ผ์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ผ๋ถ€ ๊ทœ์น™์€ ์—ฌ๊ธฐ์—์„œ๋„ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. HTML์ด๋‚˜ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆด ๋•Œ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ์ƒ๋‹นํžˆ ๋‹จ์ถ•์‹œํ‚ต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ˜ธ์ถœ์ž๋Š” ์ด ํ•˜์œ„ ์ˆ˜์ค€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ผ๋ถ€ *_dev.go ๋ฐ *_nodev.go ๋ž˜ํผ๋กœ ๋ž˜ํ•‘ํ•˜๊ณ  dev ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ๋น„ํฌํ•จ ๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ ต์ง€๋Š” ์•Š์ง€๋งŒ ๊ทธ ๊ธธ์€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋„๊ตฌ ํญ๋ฐœ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ์˜ค๋Š˜๋‚ ๋ณด๋‹ค ๋” ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฆ๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Go ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์‹คํ–‰ํ•  ๋•Œ -tags dev ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์–ด์…‹์„ ๋กœ๋“œํ•  ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Œ).

์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์ปดํ“จํ„ฐ์—์„œ runtime/emved ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์žฅ ํŒŒ์ผ๋กœ ์ธ์‹๋˜๋Š” ํŠน์ˆ˜ํ•œ ํ˜•์‹์˜ Go ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” go tool embed ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ„๋‹จํ•œ //go:generate gzip -o - static.txt | go tool embed -o static.go ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํฐ ๋‹จ์ ์€ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@DeedleFake ์ด ๋ฌธ์ œ๋Š” ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

go:generate ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํŒŒ์ผ์˜ ๋‘ ๋ฒˆ์งธ(์•ฝ๊ฐ„ ๋” ํฐ) ๋ณต์‚ฌ๋ณธ์œผ๋กœ git ๊ธฐ๋ก์ด ๋ถ€ํ’€๋ ค์ง‘๋‹ˆ๋‹ค.

์ด๋Ÿฐ. ๊ดœ์ฐฎ์•„์š”. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ์ด ์••์ถ• ์—†์ด๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์••์ถ•์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ 100MB์—์„œ 50MB๋กœ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ผญ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋”œ๋ธŒ๋ ˆ์ด์ปค๋Š” ์•„๋‹™๋‹ˆ๋‹ค. .

๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋Š” ๋งŽ์€ go ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(#6853). Go๋Š” ์ด์ง„ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด DWARF ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ๋งํฌ ์‹œ๊ฐ„์— ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„(#11799, #26074). ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์ด๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ทธ ๊ธฐํšŒ๋ฅผ ์žก์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์••์ถ• ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค๋ฐ‹๋˜๊ณ  ํฌํ•จ๋˜๋ฉฐ runtime.Embed ์™€ ์••์ถ• ํ•ด์ œ ์ธ๋ผ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ข… ์†Œ๋น„์ž ์‚ฌ์ด์— ๊ณ„์ธต์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  1, 2๋…„ ํ›„์—๋Š” ์••์ถ• ์ถ”๊ฐ€์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ์ •๋ ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

goemb๋ฅผ ์ž‘์„ฑํ•  ๋•Œ 15๊ฐ€์ง€ ๊ฒฝ์Ÿ ํ‘œ์ค€ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

@tv42 ๋Š” ๋‹ค์Œ

mmap-readonly []byte ๋…ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ OS์— ์˜ํ•ด ํŽ˜์ด์ง•๋œ ์‹คํ–‰ ํŒŒ์ผ์˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์›์‹œ ์•ก์„ธ์Šค์ž…๋‹ˆ๋‹ค.

์ด ๋Œ“๊ธ€์€ ๋†“์น˜๊ธฐ ์‰ฝ๊ณ  ๋†€๋ผ์šธ ์ •๋„๋กœ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@tv42 ,

mmap-readonly []byte๋ฅผ ๋…ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ OS์— ์˜ํ•ด ํŽ˜์ด์ง•๋œ ์‹คํ–‰ ํŒŒ์ผ์˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์›์‹œ ์•ก์„ธ์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ ์œ„์— bytes.NewReader๋งŒ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ์ฝ๊ธฐ ์ „์šฉ์ธ ์œ ํ˜•์€ string ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ io.ReaderAt ์™€ ๋‹ฌ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ํญ๋กœํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ์ฝ๊ธฐ ์ „์šฉ์ธ ์œ ํ˜•์€ string ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ „์ฒด ์ƒํƒœ๊ณ„ Write ๋“ฑ ์ž‘๋™ []byte . ๋‹จ์ˆœํ•œ ์‹ค์šฉ์ฃผ์˜์ž…๋‹ˆ๋‹ค. io.Writer.Write ๋ฌธ์„œ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์ด ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์“ฐ๊ธฐ๋Š” ์ผ์‹œ์ ์ด๋ผ๋„ ์Šฌ๋ผ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ๋‹จ์ ์€ go:generate ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํฌํ•จํ•  ๋•Œ git diff ์˜ ์ถœ๋ ฅ์„ ํ™•์ธํ•˜๊ณ  ์‹ค์ˆ˜๋กœ ํŒŒ์ผ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์œผ๋กœ - ? ์•„๋งˆ๋„ go ๋ช…๋ น์ด ํฌํ•จ๋œ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ธ์‡„ํ• ๊นŒ์š”?

@tv42

๊ทธ๋Ÿฌ๋‚˜ Write ๋“ฑ์˜ ์ „์ฒด ์ƒํƒœ๊ณ„๋Š” []byte์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

html/template ๋Š” ๋ฌธ์ž์—ด๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Go์—์„œ๋Š” ์ด๋ฏธ -ldflags -X๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๋ฌธ์ž์—ด(git ๋ฒ„์ „, ์ปดํŒŒ์ผ ์‹œ๊ฐ„, ์„œ๋ฒ„, ์‚ฌ์šฉ์ž ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉ)์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ™•์žฅํ•˜์—ฌ ๋ฌธ์ž์—ด ๋Œ€์‹  io.Readers๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@bradfitz ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ์—๋„ ์—ฌ๊ธฐ์— ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ? ์•„์ด์ฝ˜ ๋ฐ ์ž‘์€ ์ด๋ฏธ์ง€ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

@tv42 Write ๋ผ๊ณ  ๋ง์”€ํ•˜์…จ์ง€๋งŒ Read ๋ง์”€ํ•˜์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค string ์ด์— io.ReaderAt ์‚ฌ์šฉ strings.NewReader , ๊ทธ๋ž˜์„œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ์ด ์žฅ๋ฒฝ์ฒ˜๋Ÿผ ๋ณด์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@andreynering A string ๋Š” ๋ชจ๋“  ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

string ๋Š” ๋ชจ๋“  ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ํ•˜์ง€๋งŒ ์ฃผ์š” ์˜๋„๋Š” ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ํ…์ŠคํŠธ๋ฅผ ๋ณด์œ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠนํžˆ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ Go ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์™„์ „ํžˆ ์•„์ด๋””์–ด๋ฅผ ์–ป์—ˆ๋‹ค. ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor

Read ๋Š” ์ „๋‹ฌ๋œ ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ณ€๊ฒฝ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Write ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Write ๋ฌธ์„œ์—๋Š” ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ˜ํ™˜๋œ []byte ์“ฐ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํ•„์š”ํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

strings.Reader ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•ด์„œ io.WriteString ๊ฐ€ ๋ฌธ์ž์—ด ์ž‘์„ฑ์˜ ํšจ์œจ์ ์ธ ๊ตฌํ˜„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด TCPConn ์—๋Š” WriteString .

๋‚˜๋Š” Go์— ์ด์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ์†Œ์ผ“์— ์“ฐ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ•์ œ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฐ€์ •์€ ๋ฌธ์ž์—ด์€ ์‚ฌ๋žŒ์ด ์ธ์‡„ํ•  ์ˆ˜ ์žˆ๊ณ  []byte ์ข…์ข… ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์— JPEG๋ฅผ ๋„ฃ์œผ๋ฉด ํ„ฐ๋ฏธ๋„์ด ๋งŽ์ด ์—‰๋ง์ด ๋ฉ๋‹ˆ๋‹ค.

@opennota

๊ทธ๋Ÿฌ๋‚˜ html/template์€ ๋ฌธ์ž์—ด๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์‘๋‹ต:

  1. ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ์— Bytes() []byte ๋ฐ String() string ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  2. ๋ชจ๋“  ๋‹จ์ผ ์š”์ฒญ์— ๋Œ€ํ•ด ํ…œํ”Œ๋ฆฟ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— JPEG ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด TCP ์†Œ์ผ“์œผ๋กœ JPEG ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@tv42 ํ•„์š”์— ๋”ฐ๋ผ WriteString ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ์— ์ตœ์ ํ™”ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

์ด ๊ธฐ๋Šฅ์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€/js/css ์›น ์ž์‚ฐ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด ๋ง์„ ๋ฏฟ์ง€ ๋ง๊ณ  Brad's fileembed์˜ ์ผ๋ถ€ ์ˆ˜์ž…์—…์ฒด๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#fileembed pattern .+\.(js|css|html|png|svg|js.map)$
#fileembed pattern .*\.png



md5-f8b48fccd03599094034bf2b507e9e67



#fileembed pattern .*\.js$

๋“ฑ๋“ฑ..

์ผํ™” ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ: ์ด๊ฒƒ์ด ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ ์ง์žฅ์—์„œ ์ฆ‰์‹œ ๋‘ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฉฐ ๋‘˜ ๋‹ค ์ •์  ํ…์ŠคํŠธ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” //go:generate ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ƒ์ˆ˜(16์ง„์ˆ˜ ํ˜•์‹) ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€์นจ์ด ์•„๋‹Œ ์ƒˆ ํŒจํ‚ค์ง€์— ํˆฌํ‘œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฝ์„ ์žก๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ๊ณ  ์ทจ๊ธ‰/๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฌ์šฐ๋ฉฐ ๋ฌธ์„œํ™” ๋ฐ ํ™•์žฅ์ด ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "go:generate"์™€ ๊ฐ™์€ Go ์ง€์‹œ๋ฌธ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? "fmt" ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ด๊ฑธ ๊ฐ€์ง€๊ณ  ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ๋ณด์ด์‹œ์ฃ ?

๋”ฐ๋ผ์„œ Go๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ go build ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž์ฒด "๊ณต์‹" ํฌํ•จ ๋„๊ตฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@andreynering ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์™€ ์–ธ์–ด ๋„๊ตฌ๊ฐ€ ์ด๋ฅผ ํ—ˆ์šฉ

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด ์ƒ๊ฐ๋‚ฉ๋‹ˆ๋‹ค.

  • ์ž„๋ฒ ๋”ฉ ํŒŒ์ผ์€ ๋นŒ๋“œ ์บ์‹œ์™€ ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
  • ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณ€๊ฒฝ๋˜๋ฉด(์˜ˆ: ์••์ถ•), ์žฌํ˜„์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ฃผ์„์— ๋งํฌ๋œ stuffbin ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์ฒด ํ˜ธ์ŠคํŒ… ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ (HTML, JS ...) ์ž์‚ฐ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ/์••์ถ• ๋…ผ์˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ stdlib์— ํŒŒ์ผ ์‹œ์Šคํ…œ ์ถ”์ƒํ™”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ์ž์˜ ์ปดํ“จํ„ฐ์—์„œ ์ˆ˜๋งŽ์€ go run ๋ฐ ๋นŒ๋“œ๋Š” ์ž์‚ฐ์„ ์ž„๋ฒ ๋”ฉ(์„ ํƒ์ ์œผ๋กœ ์••์ถ•ํ•˜๋Š” ๋™์•ˆ)ํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•ด ๋ถ€๋‹ด์„ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์ค‘์— ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ์‰ฝ๊ฒŒ _failover_ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž์‚ฐ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด Javascript ํ”„๋ก ํŠธ์—”๋“œ์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ ์ค‘์— ๋Šฅ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„๋ฒ ๋””๋“œ ์ž์‚ฐ ๋Œ€์‹  ์ž„๋ฒ ๋””๋“œ์™€ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฐ„์— ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‚ฐ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋Š” ์ด์œ ๋กœ Go ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ปดํŒŒ์ผ ๋ฐ ์žฌ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๊ฒฐ๋ก ์ ์œผ๋กœ ๋‚ด์žฅ ํŒจํ‚ค์ง€๊ฐ€ http.FileSystem๋ณด๋‹ค ๋‚˜์€ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฐ„์— ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ

ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ œ์•ˆ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ œ์•ˆ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ‘œํ˜„ํ•œ ๋ฐฉ์‹์ด ๋ชจํ˜ธํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž„๋ฒ ๋“œ ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ตฌํ˜„์„ ์ œ์•ˆํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค, http.FileSystem ๋ณด๋‹ค ๋‚˜์€ ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ถ”์ƒํ™”๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์˜คํƒ€.

@knadh go run ์‚ฌ์šฉํ•  ๋•Œ๋„ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Packr์ด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์•ฑ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ "๊ฐœ๋ฐœ ๋ชจ๋“œ"๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๋Œ€๋กœ ๋””์Šคํฌ์—์„œ ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Packr์˜ ์ €์ž๋Š” ๋˜ํ•œ Go ๋ชจ๋“ˆ์— ๋” ์ดˆ์ ์„ ๋งž์ถ˜ ์ƒˆ๋กœ์šด ๋„๊ตฌ Pkger๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ํŒŒ์ผ์€ ๋ชจ๋‘ Go Module ๋ฃจํŠธ์™€ ๊ด€๋ จ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์•„์ด๋””์–ด๋ฅผ ์ •๋ง ์ข‹์•„ํ•˜์ง€๋งŒ Pkger๋Š” ๋””์Šคํฌ์—์„œ ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋‘˜์˜ ์กฐํ•ฉ์€ ๋†€๋ผ์šด IMO๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ "ํŒจํ‚ค์ง€ ํฌํ•จ ์ ‘๊ทผ ๋ฐฉ์‹"์€ ๋งค์šฐ ๋งˆ๋ฒ•์ ์ด์ง€๋งŒ ๋„๊ตฌ๊ฐ€ ํ˜ธ์ถœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ผ์— ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๋†€๋ผ์šด ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package embed
func FileReader(name string) io.Reader {โ€ฆ}
func FileReaderAt(name string) io.ReaderAt {โ€ฆ}
func FileBytes(name string) []byte {โ€ฆ}
func FileString(name string) string {โ€ฆ}

go ๋„๊ตฌ๊ฐ€ FileReaderAt ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ฐพ์œผ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์••์ถ• ํ•ด์ œ๋˜์–ด์•ผ ํ•จ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. FileReader ํ˜ธ์ถœ๋งŒ ์ฐพ์œผ๋ฉด ์••์ถ•๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ์„ ์••๋‹ˆ๋‹ค. FileBytes ํ˜ธ์ถœ์„ ์ฐพ์œผ๋ฉด ๋ณต์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  FileString ๋งŒ ์ฐพ์œผ๋ฉด ์ฝ๊ธฐ ์ „์šฉ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ์„ ์••๋‹ˆ๋‹ค. ๋“ฑ๋“ฑ.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ ์ ˆํ•œ go ๋„๊ตฌ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ๋…ธ๋ธŒ๊ฐ€ ์—†์–ด๋„ ์••์ถ• ๋ฐ ์ œ๋กœ ์นดํ”ผ ์ž„๋ฒ ๋”ฉ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

[ํŽธ์ง‘] ๋˜ํ•œ ๋ฌผ๋ก , ์‚ฌ์‹ค ์ดํ›„์— ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ๋งน๊ธ€๋ง์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋จผ์ € ๋ณด๋‹ค ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ์„ธํŠธ์— ์ค‘์ ์„ ๋‘๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. [/ํŽธ์ง‘]

FileReader ํ˜ธ์ถœ๋งŒ ์ฐพ์œผ๋ฉด...

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[ํŽธ์ง‘] ์‚ฌ์‹ค ๊ทธ ์˜๋ฏธ๊ฐ€ ๊ทธ๋ณด๋‹ค ๋” ๋„“์€ ๊ฒƒ ๊ฐ™์•„์š”. ์‚ฌ์šฉํ•˜๋ฉด FileReaderAt ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ• ํ•ด์ œํ•ด์•ผํ•œ๋‹ค๋Š” ํ‘œ์‹œ์ด๊ณ , ๋‹ค์Œ์˜ ์‚ฌ์šฉ FileReaderAt() ์ž„์˜์˜ ๋น„์™€ const ์ž…๋ ฅ์€ ๋ชจ๋“  ํŒŒ์ผ์„ ์••์ถ• ์ €์žฅํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ข‹์€์ง€ ๋‚˜์œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค์ง ํœด๋ฆฌ์Šคํ‹ฑ์€ ์ฒ˜์Œ์—๋Š” ์–ผ๊ตด์ด ๋ถ‰์–ด์ง€๋Š” ๊ฒƒ๋งŒํผ ์œ ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ˆ˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„( static/ ) ๋Œ€์‹  ์ฃผ์„ pragma( //go:embed )๋ฅผ ์ง€์ง€ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ธ์ˆ˜: ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ค์ง€(๋˜๋Š” xtest ์•„์นด์ด๋ธŒ)์˜ ํ…Œ์ŠคํŠธ ์•„์นด์ด๋ธŒ์— ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ) ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ์ค‘์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผ์„์€ _test.go ํŒŒ์ผ์— ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ชจ๋“ˆ์˜ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” _test.go ํŒŒ์ผ์— //go:embedglob testdata/* ์™€ ๊ฐ™์€ ์ฃผ์„์œผ๋กœ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” ํ•ด๋‹น ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ๋น„ํ…Œ์ŠคํŠธ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@fd0 ,

์ž„๋ฒ ๋”ฉ ํŒŒ์ผ์€ ๋นŒ๋“œ ์บ์‹œ์™€ ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ๋œ ํŒŒ์ผ ์ฝ˜ํ…์ธ  ํ•ด์‹œ๋Š” ์บ์‹œ ํ‚ค์— ํ˜ผํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ์™€ ๊ฐ™์ด ๋‹จ์ˆœํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‹ค์งˆ์ ์œผ๋กœ ํˆฌ๋ช…ํ•œ ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€/๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ (๋˜๋Š” ์ข‹์€ ์•„์ด๋””์–ด๋ผ๋„)

internal://static/default.css

ํŒŒ์ผ ํ•จ์ˆ˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‚ด๋ถ€ ๋˜๋Š” ๋Œ€์ฒด ์œ„์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
์˜ˆ: Package.Mount("internal[/<folder>.]", binary_path + "/resources/")

๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ "internal://"์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์‹คํ–‰ ๊ฒฝ๋กœ/์ž์›/๊ฐœ๋ฐœ ๋ชจ๋“œ์— ์žˆ๊ฑฐ๋‚˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(๊ทธ๋ฆฌ๊ณ  ๋กœ๊น… ๋ชฉ์ ์œผ๋กœ ๊ฒฝ๊ณ  ๋˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์Œ)

์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด

Package.Mount("internal", binary_path  + "/resources/private/")
Package.Mount("anotherkeyword", binary_path  + "/resources/content/")

์•„๋งˆ๋„ '๋ฆด๋ฆฌ์Šค' ๋ชจ๋“œ์— ์žˆ์„ ๋•Œ ์‹คํ–‰ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋Œ€์ฒด ์œ„์น˜๋ฅผ ์ž ๊ทธ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋Š” ์ด๊ฒƒ์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค(go_path ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ํด๋”์˜ ํด๋”๋งŒ ํ—ˆ์šฉ).

๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ค์ง€๋Š” internal:// ๋˜๋Š” ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ "๋งˆ์šดํŠธ"ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ex .ReMount("internal","myCustomName") ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ... ๋Œ€์ฒด ์œ„์น˜์—์„œ ๋งˆ์ง€๋ง‰ ๋ณ€๊ฒฝ/์ˆ˜์ • ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์™ธ๋ถ€์— ๊ทธ๋Ÿฌํ•œ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ(์ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋นŒ๋“œ ์ „์— ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ)
์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๋นŒ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด ๋ฐฐํฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์€ ์ดˆ๊ณ ์† ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจ์น˜์— ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ƒˆ ๋นŒ๋“œ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ.

Windows์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ(๋ฆฌ์†Œ์Šค์˜ ์ด์ง„ ๋ฐ์ดํ„ฐ blob์—์„œ์™€ ๊ฐ™์ด)
๊ทธ๋ฆฌ๊ณ  ์•ฝ๊ฐ„ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์ด ํŒจํ‚ค์ง€๋Š” ์‹คํ–‰ ํŒŒ์ผ, ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋˜๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์˜ ๋ฒˆ๋“ค ์•„์ด์ฝ˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ณด๋‹ˆ ์œˆ๋„์šฐ ์ „์šฉ...
๋นŒ๋”๊ฐ€ ๋Œ€์ฒด ํด๋”์— ํŒŒ์ผ์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์ •/๋ณ€๊ฒฝ ๋‚ ์งœ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์–ด๋”˜๊ฐ€์— Blob์„ ์บ์‹œํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ "๋ฐ์ดํ„ฐ Blob ์ƒ์„ฑ"์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.
์•„๋งˆ๋„ "์บ์‹œ" ํŒŒ์ผ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฒˆ๋“ค ํŒŒ์ผ์—์„œ ์••์ถ•์„ ํ™œ์„ฑํ™”ํ•˜๋„๋ก ์„ ํƒํ•˜๋ฉด(๊ฒฐ๊ตญ ์••์ถ•ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •๋œ ๊ฒฝ์šฐ) ... ์••์ถ•์ด ์„ ํƒ๋˜๋ฉด ์ˆ˜์ •๋œ ํŠน์ • ํŒŒ์ผ๋งŒ ๋นŒ๋“œ ์‹œ ๋‹ค์‹œ ์••์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. , ๋‹ค๋ฅธ ํŒŒ์ผ์€ ์บ์‹œ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฆ„์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ "udp, file, ftp, http, https ๋ฐ ๊ธฐํƒ€ ๋‹ค์–‘ํ•œ ์ธ๊ธฐ์žˆ๋Š” ํ‚ค์›Œ๋“œ"๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ผ์ข…์˜ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ๋ฐฐ์—ด/๋ฌธ์ž์—ด ๋˜๋Š” ์••์ถ•์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ... ์–ด๋–ค ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋“  ๋‚˜์ค‘์— ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๋ฅผ ๋‚จ๊ฒจ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค... ์˜ˆ๋ฅผ ๋“ค์–ด ์••์ถ• ์—†์ด ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์˜คํ”„์…‹ ๋ฐ ํŒŒ์ผ ํฌ๊ธฐ ๋ชฉ๋ก๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์••์ถ•์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: zlib, lzma, ์••์ถ• ํฌ๊ธฐ, ์ฒญํฌ ์••์ถ•์„ ํ’€๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์••์ถ•๋˜์ง€ ์•Š์€ ํฌ๊ธฐ ๋“ฑ).

์‹คํ–‰ ํŒŒ์ผ์ด UPX ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์••์ถ•๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์••์ถ• ํ•ด์ œ๋˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ:

  • Go ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” package embed ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.
  • ์••์ถ• ๋ฐ ๊ธฐํƒ€ ์กฐ์ž‘์˜ ํ•„์š”์„ฑ์€ ์ด์ง„ ํฌ๊ธฐ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ diff ์นœํ™”์ ์ธ ํ˜•์‹์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์žฌ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” "๋™๊ธฐํ™”๋˜์ง€ ์•Š์€" ์ƒํƒœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. "์†Œ์Šค"๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์••์ถ•๋œ ํ˜•์‹์„ ์ปค๋ฐ‹ํ•˜๊ณ  ํŒจํ‚ค์ง€๊ฐ€ "๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€๋Šฅ" ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ์šฐ๋ฆฌ๋Š” ํ‘œ์ค€ํ™” ๋ฌธ์ œ๋งŒ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • embed ์ƒํ˜ธ ์ž‘์šฉ์ด ์„ ํƒ์ ์œผ๋กœ "์ฝ”๋ฑ"์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํŠน์ • ์••์ถ•/๋ณ€ํ™˜์„ โ€‹โ€‹์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋„๊ตฌ ์ฒด์ธ์˜ ํ•„์š”์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋ฑ์„ ์ •ํ™•ํžˆ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ†ตํ•ฉ ๊ตฌ๋ฌธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.
package embed

type Codec interface {
    // Encode transforms a source representation to an in-binary encoded asset.
    Encode(io.Writer, io.Reader) error

    // Decode transforms an in-binary asset to its active representation that the embedded application wants to use.
    Decode(io.Writer, io.Reader) error
}

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

func NewJSONShrinker() embed.Codec {
   return jsonShrinker{}
}

type jsonShrinker struct{}
func (_ jsonShrinker)  Encode(io.Writer, io.Reader) error {
    // use json.Compact + gzip.Encode...
}
func (_ jsonShrinker)  Decode(io.Writer, io.Reader) error {
    // use gzip.Decode + json.Indent
}

๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// go:embed file.name NewJSONShrinker

func main() {
    embed.NewFileReader("file.name") // codec is implied by the comment above
}

๋˜๋Š” ์•„๋งˆ๋„

func main() {
    f, err := embed.NewFileReaderCodec("file.name", NewJSONShrinker())
    ...
}

๋‘ ๋ฒˆ์งธ ํ˜•์‹์—๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— Encode ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํˆด์ฒด์ธ์ด ์‚ฌ์šฉํ•  ์ฝ”๋ฑ์„ ์ •์ ์œผ๋กœ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์‰ฝ๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋ฑ ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์ฃผ์–ด์ง€๋ฉด ๋งค์ง ์ฝ”๋ฉ˜ํŠธ์™€ ์ฝ”๋ฑ์„ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์—ฌ๊ธฐ์— ๋ช…์‹œ๋œ ๋ชจ๋“  ๋ชฉํ‘œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๊ธฐ์—์„œ ๋งˆ๋ฒ•์˜ ๋Œ“๊ธ€์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๋‹น์žฅ ์ด ๋ชฉ์ ์„ ์œ„ํ•ด go:generate ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋งˆ์ˆ  ํŒจํ‚ค์ง€ ํ•˜๋‚˜๋งŒ์œผ๋กœ ํ˜„์žฌ ๊ด€์šฉ๊ตฌ์—์„œ ๋” ๋งŽ์ด ๋ฒ—์–ด๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Go ์ƒํƒœ๊ณ„์—๋Š” ์†Œ์Šค ํŒŒ์ผ์ด ํˆด์ฒด์ธ์— ์ถ”๊ฐ€ ์†Œ์Šค ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์ง€ ์•Š์œผ๋ฉฐ, ํ˜„์žฌ๋กœ์„œ๋Š” ๋งˆ๋ฒ•์˜ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์•„๋‹Œ ์œ ์ผํ•œ ๊ฒƒ์€ import ํ‚ค์›Œ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์••์ถ•์„ ํ•˜๋ฉด ์ฝ”๋ฑ ์œ ํ˜•์ด๋‚˜ ์••์ถ• ๋ ˆ๋ฒจ ๋…ธ๋ธŒ๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋…ธ๋ธŒ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๊ฒƒ์ด ์••์ถ•์„ ์ „ํ˜€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์žฅ ํฐ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์€ ์œ ์ผํ•œ ์„ ํƒ์€ ๋žœ๋ค ์•ก์„ธ์Šค ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์ž„์˜ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋„๊ตฌ ๋ฐ ๋Ÿฐํƒ€์ž„์—์„œ ์ ์ ˆํ•œ ์••์ถ•์„ ์„ ํƒํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ/๊ฐœ์„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ @rsc ์ธก์—์„œ๋Š” ๋‚ด๊ฐ€ ๊นจ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฐ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ (HTML, JS, CSS ๋“ฑ)๋Š” ์—ฌ์ „ํžˆ ์ž„์˜ ์•ก์„ธ์Šค๋ฅผ ์›ํ•˜๋Š” ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ ์š”์ฒญ์„ ์ง€์›ํ•˜๋Š” http.FileServer ๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋จ)

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‚ฝ์ž…ํ•œ Perkeep์˜ HTML/CSS/JS์˜ ๊ฒฐํ•ฉ๋œ ํฌ๊ธฐ๋ฅผ ๋ณด๋ฉด ์••์ถ•๋˜์ง€ ์•Š์€ 48KB์ž…๋‹ˆ๋‹ค. Perkeep ์„œ๋ฒ„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” 49MB์ž…๋‹ˆ๋‹ค. (์ž„๋ฒ ๋”ฉ๋œ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋Š” ์ด๋ฏธ ์••์ถ•๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.) ๋”ฐ๋ผ์„œ ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rsc์™€์˜ ํ† ๋ก ์—์„œ ์œ„์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๋Ÿฐํƒ€์ž„์—์„œ

package runtime

type Files struct {
     // unexported field(s), at least 1 byte long so Files has a unique address
}

func (f *Files) Open(...) (...) { ...}
func (f *Files) Stat(...) (...) { ...}
func (f *Files) EnumerateSomehow(...) { ...}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฝ”๋“œ์—์„œ:

package yourcode

//go:embed static/*
//go:embed logo.jpg
var website runtime.Files

func F() {
     ... = website.Open("logo.jpg")
}

๊ทธ๋Ÿฐ ๋‹ค์Œ cmd/go ๋„๊ตฌ๋Š” go:embed ์ฃผ์„์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ํ•ด๋‹น ํŒจํ„ด์„ glob + ํ•ด๋‹น ํŒŒ์ผ์„ ํ•ด์‹œํ•˜๊ณ  &website ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์€ ๊ฐ ํŒŒ์ผ ์ฃผ์†Œ์˜ ๋‚ด์šฉ๊ณผ ์‹คํ–‰ ํŒŒ์ผ์˜ ์œ„์น˜(๋˜๋Š” ELF/etc ์„น์…˜ ์ด๋ฆ„์ด ๋ฌด์—‡์ธ์ง€)์— ๋Œ€ํ•œ ๋งต์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์••์ถ•์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gdamore ,

์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์ฃผ๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. DTrace ์†Œ์Šค ์ฝ”๋“œ(์ž„๋ฒ ๋””๋“œ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ n๊ณผ rn์˜ ์ฐจ์ด์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค.
...
๋‹ค์–‘ํ•œ munging์ด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋Ÿฐํƒ€์ž„์— mungํ•˜์—ฌ go install์„ ์‹คํ–‰ํ•˜๋Š” Windows ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํฌํ•จ๋œ ์บ๋ฆฌ์ง€ ๋ฆฌํ„ด์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” io.Reader ํ•„ํ„ฐ๋ฅผ ๋ช‡ ๋ฒˆ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ @rsc ์˜ ์ž…์žฅ์—์„œ๋Š” ๋‚ด๊ฐ€ ๊นจ๋‹ฌ์€ ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ์••์ถ•์„ ํ•˜์ง€ ์•Š๋Š” ํŽธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ (HTML, JS, CSS ๋“ฑ)๋Š” ์—ฌ์ „ํžˆ ์ž„์˜ ์•ก์„ธ์Šค๋ฅผ ์›ํ•˜๋Š” ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ ์š”์ฒญ์„ ์ง€์›ํ•˜๋Š” http.FileServer๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋จ)

์••์ถ•๊ณผ ๋žœ๋ค ์•ก์„ธ์Šค๋Š” ์™„์ „ํžˆ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ ์ผ๋ถ€ ํ† ๋ก ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://stackoverflow.com/questions/429987/compression-formats-with-good-support-for-random-access-within-archives

์••์ถ•๊ณผ ๋žœ๋ค ์•ก์„ธ์Šค๋Š” ์™„์ „ํžˆ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๋Š” ๊ฑฐ์นœ ํƒ์ƒ‰์„ ์›ํ–ˆ๋‹ค๋ฉด. ์ด ๊ณต๊ฐ„์—์„œ CRFS์˜ stargz ํ˜•์‹์œผ๋กœ ์ž‘์—…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค . ํ•˜์ง€๋งŒ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ž๋™์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฒŒ์œผ๋ฅด๊ฒŒ ๋ถ€ํ’€๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ (๊ทธ๋ฆฌ๊ณ  sync.Pool๊ณผ ๊ฐ™์€ GC์— ๊ทธ๊ฒƒ์„ ๋“œ๋กญํ•  ์ˆ˜ ์žˆ๋‹ค), ๊ทธ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค.

์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ์ค‘์š”ํ•œ ์งˆ๋ฌธ์€ ํ•„์š”๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์‹คํ—˜์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์ด์— ๋Œ€ํ•ด ์ €๋ ดํ•˜๊ฒŒ ๋งˆ์Œ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์„ ํ˜ธํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

@bradfitz ์ข‹์€ ์ง€์ . ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ํ™•์‹คํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FWIW, ๋‚ด ์ €์žฅ์†Œ์—์„œ .d ํŒŒ์ผ์„ ๋ณผ ๋•Œ ๋œ ๋…์„ฑ์ด ์žˆ๋„๋ก git์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  git์ด๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ณ€๋•์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์—ญ๋”ฐ์˜ดํ‘œ๊ฐ€ ์žˆ๋Š” ํฌํ•จ๋œ ๋ฌธ์ž์—ด์˜ ์†์„ฑ์ด ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ฝ”๋ฑ ์•„์ด๋””์–ด์—์„œ ์–ป์€ ๊ฒƒ์€ ์••์ถ•์ด ์›ํ•˜๋Š” ์œ ์ผํ•œ ๋ณ€ํ™˜์ด ์•„๋‹ˆ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ฝ”๋ฑ ์œ ํ˜•์„ ํ†ตํ•ด ๋„๊ตฌ ์ฒด์ธ์—์„œ "์–ด๋–ค ์ฝ”๋ฑ"์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์••์ถ• ์ˆ˜์ค€ ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์••์ถ• ์—ฌ๋ถ€๋Š” ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํ˜•์‹๊ณผ ๋…ธ๋ธŒ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ "์••์ถ• ์ง€์›"์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ณ€ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ฑฐ์œ„ ์ถ”๊ฒฉ์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, i18n ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ latlong ์—์„œ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ”ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ํฅ๋ถ„ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ฃผ๋ณ€ ์˜ต์…˜์„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. // go:embed ์ง€์‹œ๋ฌธ์€ // go:generate ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ช…๋ น ํ˜ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// go:embed "file.name" go run example.com/embedders/cat file.name

๋ฌผ๋ก  ์ฃผ์š” ์ฐจ์ด์ ์€ ๋ช…๋ น ํ˜ธ์ถœ์˜ stdout์ด ์ œ๊ณต๋œ ์ด๋ฆ„ ์•„๋ž˜์— ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” ๋˜ํ•œ cat ๊ฐ€ Go๊ฐ€ ์ปดํŒŒ์ผ๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช…๋ น OS๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด go run ๊ฐ€ ์žˆ๋Š” ๊ฐ€์žฅ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ณ€ํ™˜์˜ "์ธ์ฝ”๋”ฉ" ๋‹จ๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์•„๋งˆ๋„ "๋””์ฝ”๋“œ" ๋‹จ๊ณ„์˜ ์ž‘์—…์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ฒจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. runtime/embed ํŒจํ‚ค์ง€๋Š” ์ธ์ฝ”๋”ฉ์— ๊ด€๊ณ„์—†์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋„๊ตฌ ์ฒด์ธ์— ํฌํ•จํ•˜๋„๋ก ์š”์ฒญํ•œ ๋ฐ”์ดํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋””์ฝ”๋”ฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ํ•œ ๊ฐ€์ง€ ํฐ ๋‹จ์ ์€ ํฌํ•จ๋œ ๋ฐ”์ดํŠธ๊ฐ€ zip ๋˜๋Š” ๊ธฐํƒ€๊ฐ€ ๋˜๋Š” ๊ฒƒ ์™ธ์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํฌํ•จํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. glob์€ ์—ฌ์ „ํžˆ โ€‹โ€‹zip ๋ช…๋ น์— ์˜ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ  glob์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์ •์˜ ์ธก๋ฉด์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด ์ œ์•ˆ์—์„œ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋‹จ์ˆœ ๋‚ด์žฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ƒ์„ฑ๊ธฐ ๋‚ด์žฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์€ ๊ฐ€์ • ํผ๊ฐ€๊ธฐ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผ, ๊ทธ๊ฒƒ์€ ๋นŒ๋“œ์— ์˜คํ”ˆ ์ข…๋ฃŒ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค go build ์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ํˆด ์ฒด์ธ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€ go generate ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ž์ฒด ์บ์‹œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ Go์˜ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋„๊ตฌ ์ฒด์ธ๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  go build ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋” ๋งŽ์€ ์ผ์„ ํ•ด์ค€๋‹ค(๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๊ฐ™์€)์˜ ์ „๋ฐ˜์ ์ธ ์ฃผ์ œ์— ๋งž์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” Go ๋นŒ๋“œ์— ์™ธ๋ถ€ ๋„๊ตฌ์™€ go:generate ๋ผ์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€ ๋…ธ๋ธŒ๋กœ ์••์ถ•์„ ์›ํ•  ๊ฒฝ์šฐ make ํŒŒ์ผ(๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ)์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋นŒ๋“œํ•˜๊ธฐ ์ „์— ๋ผ์ธ ์ƒ์„ฑ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๋ฌธ์ž์—ด๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ œ์•ˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฐ„์— ๊ทธ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

Make ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๋ฉด ์••์ถ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๋ฐ”๋กœ Make, go generate ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ•์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž„๋ฒ ๋“œํ•˜๊ณ  ์ผ๋ถ€ ๋ฐ”์ดํŠธ๋งŒ ์ž„๋ฒ ๋“œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

@SamWhited ,

์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” Go ๋นŒ๋“œ์— ์™ธ๋ถ€ ๋„๊ตฌ์™€ go:generate ๋ผ์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์˜ˆ.

์‚ฌ๋žŒ๋“ค์ด go:generate, Makefiles ๋˜๋Š” ๊ธฐํƒ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ์˜ค๋Š˜๋‚  ์ˆ˜์‹ญ ๊ฐ€์ง€ ์„ ํƒ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์‹ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. (๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์€ go:generate๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ "go install" ์‹œ๊ฐ„์— ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค)

@stephens2424

๋‚ด์žฅ ์ƒํ˜ธ ์ž‘์šฉ์ด "์ฝ”๋ฑ"์„ ์„ ํƒ์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํŠน์ • ์••์ถ•/๋ณ€ํ™˜์„ โ€‹โ€‹์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋„๊ตฌ ์ฒด์ธ์˜ ํ•„์š”์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

go build ๋™์•ˆ ์ž„์˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

go ๋นŒ๋“œ ์ค‘์— ์ž„์˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ์ด์ œ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. "์†Œ์Šค" ํŒŒ์ผ๋งŒ repo์— ์ปค๋ฐ‹ํ•˜๊ณ  "์ฒ˜๋ฆฌ๋œ" ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ณ  ํŒจํ‚ค์ง€๋ฅผ "๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€๋Šฅ"ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  go build ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์—์„œ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋‚ด ์ผ€์ดํฌ๋„ ๋จน๊ณ  ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค. ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ฌธ์ œ๋ฅผ ์žก์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@flimzy

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ฐฉ๋ฒ•์€ ์—†๊ณ  ๊ธฐ๋Šฅ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์†Œ์Šค์—์„œ ์ด๋ฆ„์œผ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์€ ๋™์ผํ•œ ์œ ํ˜•์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •ํ™•ํžˆ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์œ ํ˜•์ด๊ฑฐ๋‚˜ *strings.Reader ์˜ ์ธ์Šคํ„ด์Šค์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค

๋…ผ์Ÿ์˜ ์—ฌ์ง€๋Š” ์žˆ์ง€๋งŒ, ์ด ์•„์ด๋””์–ด๋Š” ์ž„๋ฒ ๋“œ ํŒจํ‚ค์ง€์˜ ๋‚ด๋ณด๋‚ธ ๊ธฐ๋Šฅ์„ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ - ์„œ๋ช…์—๋Š” ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์œ ํ˜•์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ(์•„๋ž˜ ์ฐธ์กฐ) ๋ณ€์ˆ˜, ์ธ์ˆ˜ ๋˜๋Š” ํ•ด๋‹น ์œ ํ˜•์˜ ๋ฐ˜ํ™˜์„ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ reflect.ValueOf ์ž์ฒด์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๊ฐ’์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜์‚ฌ๊ฐ€ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋ฆ„).

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. embed ์˜ ์ตœ์ƒ์œ„ ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ๋ชจ๋“  ํฌํ•จ๋œ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ƒ์„ฑํ•˜๋Š” ์ œํ•œ์„ ๊ฐ€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋‹จ์ˆœํžˆ ๋น„๊ด€์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐ€์žฅ ๊ฐ„๋‹จํ•จ). ์ด๋Š” ์ž„๋ฒ ๋””๋“œ ํŒจํ‚ค์ง€๋กœ ๊ทน๋„๋กœ ์ด์ƒํ•˜๊ณ  ์“ธ๋ชจ์—†๋Š” ์ผ์„ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ • ํ•˜๋ฉด ์ผ๋ถ€ ์ตœ์ ํ™”๋ฅผ ์žƒ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์–ด์จŒ๋“  ์•ฝ์†ํ•  ํ•„์š”๋Š” ์—†์Œ). ๊ณต์ •ํ•ด ๋ณด์ธ๋‹ค.

์‚ฌ์‹ค ๊ทธ ์˜๋ฏธ๋Š” ๊ทธ๋ณด๋‹ค ๋” ๊ด‘๋ฒ”์œ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. FileReaderAt์˜ ์‚ฌ์šฉ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์••์ถ• ํ•ด์ œ๋˜์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ์šฐ, ๋น„ const ์ž…๋ ฅ๊ณผ ํ•จ๊ป˜ FileReaderAt()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํŒŒ์ผ์ด ์••์ถ•๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ž„๋ฒ ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ํŒŒ์ผ ์ด๋ฆ„์„ ์ •์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ const ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ string ๋ฅผ ํŒŒ์ผ ์ด๋ฆ„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‹ค์ œ๋กœ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ type filename string ์—ฌ์•ผ ํ•˜๊ณ  ํ•จ์ˆ˜ ์ธ์ˆ˜ ์™ธ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ๋ฌธ์ž์—ด ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ์€ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@๋ฉ”๋กœ๋น„์šฐ์Šค

const๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ์ž ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: FileReaderAt() ). const๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 100๊ฐœ์˜ ํŒŒ์ผ์„ ํฌํ•จํ–ˆ์ง€๋งŒ FileReaderAt(filename) ํ˜ธ์ถœ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ filename ๋Š” ์ผ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฌํ•จ๋œ ํŒŒ์ผ ์ค‘ ์–ด๋–ค ํŒŒ์ผ์ด ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์•ก์„ธ์Šค๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ๋ชจ๋‘ ์••์ถ•๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@flimzy ์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, const๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ ์ด๋ฆ„์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ง„์ง€ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. :) ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๊ทธ๊ฒƒ์€ ์ž˜๋ชป๋˜์—ˆ๊ณ  ์‹ค์ˆ˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ globํ•˜๊ฑฐ๋‚˜ ํฌํ•จํ•˜๊ณ  ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์•„์ง์ด ํ•ด๊ฒฐ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ - ์ฝœ๋ ‰์…˜ ๋‹น ๊ฒฐ์ •์„ํ•จ์œผ๋กœ์จ ์˜ˆ (DIR / ๊ธ€๋กœ๋ธŒ) ๋งŒ ์ƒ์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ๋žŒ์„ ์„ ํƒํ•  ์ˆ˜ -ํ•˜์ง€๋งŒ ๋งํ–ˆ๋“ฏ์ด : ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ API ๋‚˜ ๋•Œ๋ฌธ์— ์ด๋™ ๋„๊ตฌ์— ๋Œ€ํ•œ ์Šˆํผ ์ ์ ˆํ•œ์„ ๊ณ ๋ คํ•  ๊ฒƒ ์•„๋‹ˆ๋‹ค ์–ผ๋งˆ๋‚˜ ๋งˆ๋ฒ• ๊ฐ™์€์ง€. ๋”ฐ๋ผ์„œ ์ด์™€ ๊ฐ™์€ ์žก์ดˆ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๊ฐœ๋…์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ณต๊ฐ„์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

์ด์ „ ๋ฉ”์‹œ์ง€์—์„œ ๋ณผ ์ˆ˜ ์—†์—ˆ๊ณ  ํŒŒ์ผ์„ Go ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋œ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜ go ๋นŒ๋“œ/์„ค์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ž˜ํผ ํŒจํ‚ค์ง€๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค(๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ถœ์ฒ˜).

๋‚˜๋Š” ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ์„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํ™•์‹คํžˆ์ด ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์‹ค์ œ๋กœ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐฐํฌํ•˜๊ธฐ ์‰ฌ์šด ๋งŽ์€ ์ข…์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Go ๋ฐ”์ธ๋”ฉ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์™€!!!

@Julio-Guerra
์—ฌ์ „ํžˆ ๋””์Šคํฌ์— ์••์ถ•์„ ํ’€๊ณ  dlopen ๋ฐ dlsym์„ ์‚ฌ์šฉํ•˜์—ฌ C ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์•ฝ๊ฐ„ ์˜คํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ƒ์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

http ์ •์  ์ž์‚ฐ ์™ธ๋ถ€์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์— ํ•„์š”ํ•œ ์ž„๋ฒ ๋””๋“œ blob์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ž„๋ฒ ๋””๋“œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  io.Reader์—์„œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‘ ๋ฐฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.

@glycerine , ์—ญ์‹œ string ์ž…๋‹ˆ๋‹ค. string ๋Š” ํฌ์ธํ„ฐ์™€ ๊ธธ์ด์ž…๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ์š”? ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ชจ๋“  ํŒŒ์ผ์„ ์ฝ๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์••์ถ•ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•  ๋•Œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ๊ณ„์‚ฐ์—์„œ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@burka ์Šค๋ ˆ๋“œ์—์„œ ์ด์ „์— ๋งํ–ˆ๋“ฏ์ด go build ๋Š” ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@burka , ๋ช…์‹œ์ ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ์ •(์ปดํŒŒ์ผ ์‹œ ์ฝ”๋“œ ์‹คํ–‰ ์—†์Œ)์€ ์˜ค๋ž˜์ „์— ๋‚ด๋ ค์ง„ ๊ฒƒ์ด๋ฉฐ ์ด๋Š” ํ•ด๋‹น ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์˜ ๋ถ€์ž‘์šฉ์€ ์ด๋™ ํ”„๋ก์‹œ๊ฐ€ ์ €์žฅ ํŒŒ์ผ์„ ์ด๋™ ํŒŒ์ผ๋กœ๋งŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ก์‹œ๋Š” Go ์ฝ”๋“œ์— Go๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์ €์žฅ์†Œ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ๊ฐ€ ์ด๋ฏธ ์ด๋ฅผ ์œ„ํ•ด ์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์–ธ์  ๊ฐ€๋Š” ๊ทธ๋“ค์ด ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@leighmcculloch ๊ทธ๋ž˜๋„ ์š”์ฆ˜์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์š”. Go ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ๋น„ Go ํŒŒ์ผ์€ go test ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“ˆ ์•„์นด์ด๋ธŒ์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ cgo์šฉ C ํŒŒ์ผ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ๋ฐฉํ–ฅ์ด๋ฉฐ ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ _how_์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ๊ตฌ์ƒํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ž„๋ฒ ๋”ฉ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์™€ ๊ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ œ์‹œ ํ•˜๋Š” ๊ณผ์ œ ๋ฅผ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ €์—๊ฒŒ๋Š” ์ •๋ง ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” HTML+CSS+JS+JPG+etc๋ฅผ ํฌํ•จํ•˜์—ฌ go ์•ฑ์ด ์‹คํ–‰๋  ๋•Œ http.FileServer ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ํŒŒ์ผ์„ ๋””๋ ‰ํ† ๋ฆฌ์— ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋‚˜๋Š” ๋…์ž๋ฅผ ๋…ผ์˜ ์ฝ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ ‘๊ทผ๋กœ ์ด๋™์—์„œ ํŒŒ์ผ์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๊ฐ€๊ฐ€ ๋‚˜์—๊ฒŒ ์™ธ๊ตญ์ด์—ˆ๋‹ค ์˜๊ฒฌ์˜ ๋Œ€๋ถ€๋ถ„์€, ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ ์„ ๊ฐ์•ˆ go-bindata (์ด๊ธฐ๋Š”ํ•˜์ง€๋งŒ _ ๋””์Šคํฌ์— ๋ณต์‚ฌ ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ ๋” ๋‚˜์€ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)_

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์˜ ๊ณผ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋””๋ฒ„๊ฑฐ์™€ ํ•จ๊ป˜ GoLand๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์›น ์•ฑ์—์„œ ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์ค‘์— ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ง์ ‘ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด http.FileServer ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฑ์ด ์‹คํ–‰๋  ๋•Œ http.FileServer ๋Š” ์ž„๋ฒ ๋”ฉ ์†”๋ฃจ์…˜์ด ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปดํŒŒ์ผํ•  ๋•Œ go-bindata๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ Git์— ์ฒดํฌ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ์ผ๋ฐ˜์ ์œผ๋กœ go-bindata ๋กœ ์ž‘๋™ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ์•„์ด๋””์–ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋œ ์‹คํ–‰ ํŒŒ์ผ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์— ๋””๋ฒ„๊ฑฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด go-bindata ๋กœ ์ž‘์„ฑ๋œ ์ž„๋ฒ ๋””๋“œ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด์ž ๊ณผ์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ฐ ๊ด€๋ จ ๋ฌธ์ œ ์„ธํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ํ† ๋ก ์€ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ๊ณต๊ฐ„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ณ /๋˜๋Š” ์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ์ด ์ฃผ์–ด์ง„ ๋ฌธ์ œ ๊ณต๊ฐ„์˜ ํŠน์ • ์š”๊ตฌ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ณ ๋ คํ•ด์ฃผ์…”์„œ ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” template.ParseFiles๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go.mod ๋ฅผ ํ†ตํ•ด ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊นจ๋—ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ (๊ธฐ์กด ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์˜ตํŠธ์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—) ์—ญํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์–ด๋–ค ํŒŒ์ผ์ด ํ•„์š”ํ•œ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ(์˜ˆ: go proxies)๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. go mod init ๋ช…๋ น์€ ์ƒˆ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๋ฒ„์ „์„ ํฌํ•จํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋˜์–ด ํ–ฅํ›„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ‘œ์ค€ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜(์„ ํƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ๊นจ๋—ํ•˜๊ณ /๊ฐ„๋‹จํ•œ ์ด๋ฆ„์ด ๋  ์ˆ˜ ์žˆ์Œ) ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ go.mod ์ž์ฒด์— ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค(๊ทธ๋Ÿฌ๋‚˜ go mod init ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ด์™€ ๊ฐ™์€ ์†”๋ฃจ์…˜์€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ๊ณผ "๋งˆ๋ฒ•"์ด ์ ์€ ๊ท ํ˜•์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@jayconrod ๋Š” ๋‹ค์Œ

ํŠน์ˆ˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„(static/) ๋Œ€์‹  ์ฃผ์„ pragma(//go:embed)๋ฅผ ์ง€์ง€ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ธ์ˆ˜: ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํŒจํ‚ค์ง€(๋˜๋Š” xtest ์•„์นด์ด๋ธŒ)์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์•„์นด์ด๋ธŒ์— ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘.

์ด๊ฒƒ์€ ์ •๋ง ์ข‹์€ ๊ด€์ฐฐ์ž…๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์นœ์ˆ™ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋นŒ๋“œ์˜ ๊ฒฝ์šฐ static_test static , ํ…Œ์ŠคํŠธ ๋นŒ๋“œ์˜ ๊ฒฝ์šฐ static_amd64 , amd64 ๋นŒ๋“œ์˜ ๊ฒฝ์šฐ

์ •์  ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋นˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•จ). ์—ฌ๊ธฐ์—๋Š” glob์ด ํฌํ•จ๋˜๊ณ  ๋นŒ๋“œ ํƒœ๊ทธ ๋ฐ ๋‚˜์ค‘์— ์••์ถ• ๋“ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์žฅ์ ์€ go list๊ฐ€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ํŠธ๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์€ ๋งค์šฐ haccess๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  ๊ฐ์‚ฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ํŒจํ‚ค์ง€๋กœ ๋ฌถ๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ œ๋กœ ๋…ธ๋ธŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŠน์ˆ˜ ๋””๋ ‰ํ† ๋ฆฌ go.files ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชจ๋“ˆ์˜ go.mod ์™€ ์œ ์‚ฌ). ์‹ฌ๋ณผ์„ ๋‚ด๋ณด๋‚ด๋„๋ก ์„ ํƒํ•˜์ง€ ์•Š๋Š” ํ•œ ์•ก์„ธ์Šค๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‹จ์ผ ๊ธฐ๋Šฅ runtime/files ์ œ์•ˆ:

package files

func Open(name string) (io.ReadCloser, error) {
    // runtime opens embedded file based on caller package
    return rc, nil
}
package foo

import "runtime/files"

func ReadPackageFile(name string) ([]byte, error) {
    rc, err := files.Open(name)
    if err != nil {
        return nil, err
    }
    defer rc.Close()
    return ioutil.ReadAll(rc)
}

import "C" ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ด๋ฏธ "๋งˆ๋ฒ•" ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์„ ๋ก€๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. IMO ๊ทธ๊ฒƒ์€ ๊ฝค ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” template.ParseFiles๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ”๋กœ ๊ทธ ํŒŒ์ผ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž„ํ”„๋ฆฐํŠธ ๋˜๋Š” ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…๊ณผ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ์€ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ  ๋Ÿฐํƒ€์ž„์— ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ ์ž„๋ฒ ๋””๋“œ ๋ฒ„์ „์„ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ '๋‚ด๋ณด๋‚ด๊ธฐ' ๋ฐ '๋ฐ”๊พธ๊ธฐ'ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด๋ถ€์ ์œผ๋กœ ์–ธ๊ธ‰๋œ API ํ˜ธ์ถœ ์‚ฌ์šฉ).

๋ฌผ๋ก  ์ด ๋ชจ๋“  ๊ฒƒ์€ ๋ฐฐํฌ๋ฅผ ํ™•์‹คํžˆ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ์ผ์ข…์˜ ์ž„๋ฒ ๋”ฉ์ด ์‹ค์ œ๋กœ ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์—ด์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง์žฅ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  Golang ํ”„๋กœ์ ํŠธ์— ํŒŒ์ผ์„ ์ž„๋ฒ ๋”ฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด Golang์ด ๋น„๋ช…์„ ์ง€๋ฅด๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ •์  ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด๊ณ  ๋ณดํŽธ์ ์ธ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์ˆ˜ ์ž์‚ฐ ํŒŒ์ผ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์œผ๋กœ์จ ์ด๋ฅผ ์ˆ˜์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ ํ˜ธํ•˜๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ๋งˆ๋ฒ•์˜ ์ฃผ์„๊ณผ ๊ฐ™์€ ๋˜ ๋‹ค๋ฅธ ์‹ ํ˜ธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋‚ด์žฅ๋œ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ ๋ฐฉ์‹์— ์นœ์ˆ™ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ runtime/embed ํŠน์ˆ˜ ํŒจํ‚ค์ง€๋ฅผ ์„ ํƒํ•˜๋ฉด ์ด๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ–ฅํ›„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌํ˜„์ด ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

type EmbedPackage interface {
    Bytes(filename string) []bytes
    BytesCompressed(filename string, config interface{}) []bytes // compressed in-binary as configured by some kind of config struct, memoizes decompression during runtime on first access
    Reader(filename string) io.Reader
    File(filename string) os.File // readonly and contains all metadata
    Dir(filepath string) []os.File 
    Glob(pattern string) []os.File // like filepath.Glob()

    // maybe? this could allow to load JSON, YAML, INI, TOML, etc files more easily
    // but would probably be too much for the std lib implementation
    Unmarshal(filename string, config interface{}, ptr interface{}) 
}

์ฝ”๋“œ์˜ ์–ด๋”˜๊ฐ€์—์„œ ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์„ ๋Ÿฐํƒ€์ž„์— ์ œ๊ณตํ•˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// embed a file that is compressed in-binary and automatically decompressed on first access
var LongText = embed.BytesCompressed("legal.html", embed.Config{ Compression: "gzip", CompressionLevel: "9" })

// loads a single file as reader for easy access
var FewLinesOfText = bufio.NewReader(embed.Reader("lines.txt"))
for _, line := range FewLinesOfText.ReadLines() { ... }

// embeds all files in the directory
var PdfFontFiles = embed.Dir("/fonts")

// unmarshals file into custom config
var PdfProcessingConfig MyPdfProcessingConfig
embed.Unmarshal("/pdf_conversion.json", embed.Config{ Encoding: "text/json" }, &PdfProcessingConfig)

๋˜ํ•œ ์ด๋ฏธ ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ go.mod ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ๊ทธ ์•„๋ž˜ 1 ๋””๋ ‰ํ† ๋ฆฌ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ํŒŒ์ผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ œํ•œํ•œ๋‹ค๋ฉด ๋ณด์•ˆ ๋ฌธ์ œ์™€ ์žฌํ˜„์„ฑ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ์ž„๋ฒ ๋“œ ๊ฒฝ๋กœ๋Š” ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ์ˆ˜์ค€์„ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค ์ค‘์— ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ ๋’ค์— zip ์•„์นด์ด๋ธŒ๋ฅผ ๋งŒ๋“ค์–ด ํšจ๊ณผ์ ์œผ๋กœ ์ž๋™ ์••์ถ• ํ’€๋ฆผ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ด๊ฒƒ์ด ์œ ์šฉํ• ๊นŒ์š”? ์—ฌ๊ธฐ์—์„œ ์‹คํ—˜์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/sanderhahn/gozip

Go์—๋Š” ์ด๋ฏธ "testdata"๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ผ๋ฐ˜ IO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐฐ์†ก๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ฆด, ๋งˆ์ˆ , ์••์ถ•๋œ ์ปจํ…Œ์ด๋„ˆ ๋…ผ๋ฆฌ, ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ฐ„์ ‘ ์ฐธ์กฐ, META-INF๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฆ„๋‹ต๊ณ  ๋‹จ์ˆœํ•˜๋ฉฐ ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆ๋“ค ๋Ÿฐํƒ€์ž„ ๋ฒ”์œ„ ์ข…์†์„ฑ์„ ์œ„ํ•œ "data" ํด๋”๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Github ea์—์„œ ๊ธฐ์กด Go ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์Šค์บ”ํ•˜๊ณ  ์ด๋ฏธ "data" ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์กฐ์ •์ด ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ. a์˜ ์„ค๋ช…์€ static ๋””๋ ‰ํ† ๋ฆฌ ์šฐ๋ฆฌ๊ฐ€ ํ† ๋ก ํ•˜๋ฉด 100 % ๋‚˜์—๊ฒŒ ๋ถ„๋ช…ํ•˜๋‹ค static _source_ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” static ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ _at ๋  ๊ฒƒ์ด๋‹ค ๋””๋ ‰ํ† ๋ฆฌ

๊ทธ๋ฆฌ๊ณ  ์ด ๊ตฌ๋ถ„์€ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ๋ฐ ๊ฐœ๋ฐœ ์ค‘์ธ ๋””๋ฒ„๊น… ์ฝ”๋“œ์™€ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@mikeschinkel ๋นŒ๋“œ ์‹œ ์ž„๋ฒ ๋”ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋งค์šฐ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

go install / go build ์ž๋™์œผ๋กœ ์ž„๋ฒ ๋”ฉ ์ˆ˜ํ–‰

์›๋ณธ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์œ„์˜ ์ผ๋ถ€ ๋Œ“๊ธ€์—์„œ๋„ ๋Ÿฐํƒ€์ž„์— ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” "dev" ๋ชจ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@mvdan ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œ์•ˆ๋œ /static/ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•ฑ ์ €์žฅ์†Œ, ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ ๋ฐ/๋˜๋Š” ๋‘˜ ๋‹ค์˜ ๋ฃจํŠธ์— ์ƒ๋Œ€์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋Ÿฐํƒ€์ž„ ํŒŒ์ผ์˜ ์œ„์น˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•˜๋ ค๋Š” ์œ„์น˜์— ์ „์ ์œผ๋กœ ์˜์กดํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์ด ๋ชจ๋‘ ์‚ฌ์‹ค์ด๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ณด์ธ๋‹ค๋ฉด ๋””๋ฒ„๊น… ์ •๋ณด๋กœ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์ด ์„ ํƒ์ ์œผ๋กœ ์†Œ์Šค ์œ„์น˜์—์„œ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์—ฌ ๋งŽ์€ ์ถ”๊ฐ€ ๋ฐ ๋น„ํ‘œ์ค€ํ™”๋œ ๋กœ์ง ๋ฐ ์ฝ”๋“œ ์—†์ด ๋””๋ฒ„๊น…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“ˆ ํ”„๋ก์‹œ ๋ช‡ ์‚ฌ๋žŒ. ์ด ๊ธฐ๋Šฅ์˜ ์ข‹์€ ๋””์ž์ธ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๋ฆฌํŠธ๋จธ์Šค ํ…Œ์ŠคํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚ ์—๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋นŒ๋“œ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ ํ”„๋ก์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋””์ž์ธ ์ค‘ ์ผ๋ถ€๋Š” ๋ชจ๋“ˆ ํ”„๋ก์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ์ •์  ํŒŒ์ผ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ๋˜ํ•œ go.mod๋ฅผ ์˜ตํŠธ์ธ์œผ๋กœ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„์ด๋””์–ด: go.mod ํŒŒ์ผ์˜ ์‚ฌ์–‘? ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

module github.com/foo/bar

data internal/static ./static/*.tmpl.html

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” Glob ๊ตฌ๋ฌธ์ด ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ œ์™ธ: ** glob ๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค.)

import "github.com/foo/bar/internal/static"

f, err := static.Open("static/templates/foo.tmpl")

StripPrefix์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—ฌ๊ธฐ์—๋Š” ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ž˜ํผ ํŒจํ‚ค์ง€๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋” ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

module github.com/foo/bar

data ./static/*.tmpl.html
import "runtime/moddata"

moddata.Open("static/foo.tmpl")

๊ทธ๋Ÿฌ๋‚˜ moddata๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํŒจํ‚ค์ง€/๋ชจ๋“ˆ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ฌํผ(์˜ˆ: http.Filesystem ๋ณ€ํ™˜๊ธฐ)๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚ ์—๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋นŒ๋“œ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ ํ”„๋ก์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋””์ž์ธ ์ค‘ ์ผ๋ถ€๋Š” ๋ชจ๋“ˆ ํ”„๋ก์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ์ •์  ํŒŒ์ผ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ํฐ ๋ณ€ํ™”๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, C ์ฝ”๋“œ๋Š” ์ด๋ฏธ ํŠธ๋ฆฌ์— ๋ชจ๋“  ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๋ชจ๋“ˆ ํ”„๋ก์‹œ๋Š” C๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋„์ž…ํ•˜๋Š” ๋งˆ๋ฒ•์˜ ์ฃผ์„์ด๋‚˜ API๊ฐ€ ๋ฌด์—‡์ด๋“  ์ž‘์€ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋””์ž์ธ ์ค‘ ์ผ๋ถ€๋Š” ๋ชจ๋“ˆ ํ”„๋ก์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ์ •์  ํŒŒ์ผ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

"go ๋„๊ตฌ๋Š” ๋นŒ๋“œํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค"๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์—์„œ ๋„˜์ง€ ์•Š์„ ๋ชจ๋ž˜์— ๊ทธ๋ ค์ง„ ์„ ์ด๋ผ๋Š” ๊ฒƒ์ด ๊ฝค ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  go ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ฝ”๋“œ ์—†์ด ํฌํ•จํ•  ํŒŒ์ผ์„ ๋งํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ƒ๊ฐ์„ ์„ค๋“๋ ฅ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์••์ถ•ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ @broady๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์— ํฐ +1์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•œ ๋‚ด์šฉ์ด ๋Œ€๋ถ€๋ถ„ ๋ฐ˜์˜๋œ ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฌ๋‚˜ ํ‚ค์›Œ๋“œ๋Š” ๋ช…์‚ฌ data ๋Œ€์‹  embed ๋™์‚ฌ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ํฌํ•จ๋œ ํŒŒ์ผ์€ ํŠน๋ณ„ํ•œ ์ฃผ์„์ด๋‚˜ ๋งค์ง ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Go ํ”„๋กœ์ ํŠธ์—์„œ go.mod ํŒŒ์ผ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“ˆ/ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฏ€๋กœ ํฌํ•จ์„ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  2. ๊ฒŒ๋‹ค๊ฐ€, ์ž„๋ฒ ๋””๋“œ ํŒŒ์ผ ๋ชจ์Œ์€ ์ผํšŒ์„ฑ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ํ”„๋กœ์ ํŠธ์— ์ž„์‹œ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ๊ฐ€์น˜ ์žˆ๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•„์ด๋””์–ด๋Š” ์ž„๋ฒ ๋””๋“œ๊ฐ€ ํŒจํ‚ค์ง€๋กœ ๊ตฌํ˜„๋˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด Github์„ ํ†ตํ•ด ๊ฐœ๋ฐœํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” GitHub์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์œ ์ง€ ๋ฐ ๋ฌด๋ฃŒ ์‚ฌ์šฉ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

    NS. ๊ฐ ํŒŒ์ผ์— ํ•ด๋‹น ๊ตญ๊ฐ€์˜ ๋ชจ๋“  ์šฐํŽธ ๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋œ ๊ตญ๊ฐ€์˜ ํŒŒ์ผ,
    NS. ๋ธŒ๋ผ์šฐ์ € ์‹๋ณ„์„ ์œ„ํ•ด ์•Œ๋ ค์ง„ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ํŒŒ์ผ,
    ์”จ. ์„ธ๊ณ„ ๊ฐ๊ตญ์˜ ๊ตญ๊ธฐ ์ด๋ฏธ์ง€,
    NS. Go ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์‹ฌ์ธต ๋„์›€๋ง ์ •๋ณด,
    ์ด์žํ˜•. ๋“ฑ๋“ฑ...

  3. ํŒจํ‚ค์ง€์—์„œ ํŒŒ์ผ์„ ์—ด๊ณ  ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” goembed:// ์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด URL ๊ตฌ์„ฑํ‘œ(๋˜๋Š” ๊ธฐ์กด ๊ตฌ์„ฑํ‘œ

    data, err := ioutil.ReadFile("goembed://postal-codes.txt")    
    if (err != nil) {
      fmt.Println(err)
    }
    

์œ„์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋ฉด _"๋งˆ๋ฒ•"_์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜๋„๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํ™•์žฅ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. go.mod ์ƒˆ ๋™์‚ฌ ํ•˜๋‚˜์™€ Go์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ธ์‹ํ•  ์ƒˆ URL ์ฒด๊ณ„ ํ•˜๋‚˜. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ Go์—์„œ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ง€๊ธˆ ํ•˜๋Š” ์ผ

๋‚˜๋Š” ์ง€๊ธˆ ์ด๊ฒƒ์„ ์œ„ํ•ด code.soquee.net/pkgzip ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์ „์—ญ ์ƒํƒœ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ถ€์ž‘์šฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” statik ์˜ ํฌํฌ์ž…๋‹ˆ๋‹ค). ๋‚ด ์ผ๋ฐ˜์ ์ธ ์›Œํฌํ”Œ๋กœ(์ ์–ด๋„ ์›น ์•ฑ์—์„œ)๋Š” ZIP ํŒŒ์ผ์— ๋ฒˆ๋“ค๋œ ์ž์‚ฐ์„ ํฌํ•จํ•˜๊ณ  golang.org/x/tools/godoc/vfs/zipfs ๋ฐ golang.org/x/tools/godoc/vfs/httpfs ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

go:embed ์ ‘๊ทผ ๋ฐฉ์‹

go:embed ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋ฌธ์„œ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์ž์‚ฐ์ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ „์ฒด์— ํฉ์–ด์ ธ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ์™ธ๋ถ€ ๋„๊ตฌ์™€ go:generate ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ์ „์— ๋‹ค์–‘ํ•œ ์ž์‚ฐ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด makefile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค). makefile์—์„œ ๋ชจ๋‘ ๋ณผ ์ˆ˜ ์žˆ์Œ)

๋˜ํ•œ ์œ„์— ํฌํ•จํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‚ฐ์ด ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€๊ฐ€ ๋˜๋Š” ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์ „์ฒด ๋ชจ๋“ˆ๊ณผ ๋ฐ˜๋Œ€)๋Š” ๋นŒ๋“œ ํƒœ๊ทธ, ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€ ๋“ฑ์˜ ๋ชจ๋“  ๋ณต์žก์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. . ์ ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ๊ณต๊ฐœ์ธ์ง€ ๋น„๊ณต๊ฐœ์ธ์ง€ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”๊ฐ€ ๋นŒ๋“œ ๋ณต์žก์„ฑ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ ์€ ์ž์‚ฐ์„ ๋” ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ. ๊ธ€๊ผด์„ ํฌํ•จํ•˜๋Š” ๋‹จ์ผ Go ํŒŒ์ผ์ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์ผ๋ถ€ ์•„์ด์ฝ˜์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ go ํŒจํ‚ค์ง€์ฒ˜๋Ÿผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ๋‹จ์ˆœํžˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ์•„์ด์ฝ˜ ๊ธ€๊ผด์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import "forkaweso.me/forkawesome/v2"

์ž„๋ฒ ๋””๋“œ ํŒจํ‚ค์ง€ ์ ‘๊ทผ ๋ฐฉ์‹

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋ช…์‹œ์ ์ด๊ณ  ์ •์ƒ์ ์ธ Go ์ฝ”๋“œ๋ผ๋Š” ์•„์ด๋””์–ด๋Š” ์ข‹์ง€๋งŒ ์ด๊ฒƒ์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๋˜ ๋‹ค๋ฅธ ๋งˆ๋ฒ• ํŒจํ‚ค์ง€๋ผ๋Š” ์ƒ๊ฐ์€ ์‹ซ์Šต๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์–ธ์–ด ์‚ฌ์–‘์˜ ์ผ๋ถ€๋กœ ์ •์˜๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Go ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ตฌํ˜„ ์‚ฌ์ด์—์„œ ์ค‘๋‹จ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์žฅ์†Œ๊ฐ€ ๋˜๋ฉฐ, ์ด๊ฒƒ๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์†์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์ด ๋นŒ๋“œ ์‹œ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ด ํŒจํ‚ค์ง€๊ฐ€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ๋˜๋Š” ์ƒ์ˆ˜๋งŒ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๊ฒƒ์„ ํƒ€์ž… ์‹œ์Šคํ…œ์— ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ณ , ํ˜ผ๋™์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ์ˆ˜ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋„์ž…ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” ์ฃผ์š” ์–ธ์–ด ๋ณ€๊ฒฝ์„ ์ด์•ผ๊ธฐํ•˜์—ฌ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์žก์ข…

๋‚˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋Œ“๊ธ€์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ (์‚ฌ๋ฐฉ์— ํฉ์–ด์ ธ ์žˆ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ฉ”๋ชจ๋กœ ๊ธฐ๋ถ„์ด ์ข‹์ง€ ์•Š์Œ) ๋ชจ๋“  ์ž์‚ฐ์„ ํ•œ ๊ณณ์— ๋ชจ์•„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. go.mod ํŒŒ์ผ์ด ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งํ–ˆ๋‹ค :

module forkaweso.me/forkawesome/v2

go 1.15

embed (
    fonts/forkawesome-webfont.ttf
    fonts/forkawesome-webfont.woff2
)

์ด๋Š” ์ž์‚ฐ์ด ๋ณ„๋„์˜ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ž„์˜์˜ ๋นŒ๋“œ ํƒœ๊ทธ์— ์˜ํ•ด ๋˜๋Š” ์ž„์˜์˜ ํŒจํ‚ค์ง€(์˜ˆ: _testing ํŒจํ‚ค์ง€)์— ํฌํ•จ๋˜๊ฑฐ๋‚˜ ์ œ์™ธ๋  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ ๊ฐ์†Œ๊ฐ€ ๋ฐ”๋žŒ์งํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ฐ€์ ธ์˜ค๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋นŒ๋“œ ํƒœ๊ทธ๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ํฌํ•จํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅธ ์ž์‚ฐ์ด ์—†๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค) ํ•˜์ง€๋งŒ YMMV. ์ด๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๋ฉด ์ฃผ์„๊ณผ ๊ฐ™์€ pragma๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋‚ด๊ฐ€ go.mod ๋ฒ„์ „์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ ์ œ์•ˆ๊ณผ ๋‹ฌ๋ฆฌ ์ด๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋Œ€์‹ , ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋Šฅ. ELF ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ ์„น์…˜ ์ฝ๊ธฐ(๋˜๋Š” ์‚ฌ์šฉ ์ค‘์ธ OS์— ์ƒ๊ด€์—†์ด ์ €์žฅ๋จ)๋Š” ์ ์ ˆํ•œ ์œ„์น˜์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค(์˜ˆ: os ๋˜๋Š” debug/elf ๋“ฑ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„ ํƒ์ ์œผ๋กœ OP์— ์„ค๋ช…๋œ ํŒจํ‚ค์ง€์™€ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•˜๋Š” ์ƒˆ ํŒจํ‚ค์ง€๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ, ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋‚ด์žฅ๋œ ์ž์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ๋‚ด์žฅ๋œ ํŒŒ์ผ์„ ์ฝ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค(์ฆ‰, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด).

์ด๊ฒƒ์€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋งŒ ์ธ์ˆ˜๋กœ ํ—ˆ์šฉํ•˜๋„๋ก ๋งค์ง ํŒจํ‚ค์ง€๋ฅผ ์ œํ•œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ํฌํ•จ๋œ ์ž์‚ฐ์ด ์‹ค์ œ๋กœ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ถ”๊ฐ€ ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ํŒจํ‚ค์ง€๋Š” ์ƒˆ ํŒจํ‚ค์ง€ ์ž์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€ ๊ฐ„์˜ ์ƒˆ๋กœ์šด ์ข…์†์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

var IconFont = embed.Dir("forkaweso.me/forkawesome/v2/fonts/")
var Logo = embed.File("images/logo.jpg")

์œ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ชจ๋“ˆ์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐ์น˜ํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ํ•ด๋‹น ํŠน์ • ๋ชจ๋“ˆ๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ API์™€ ์ž์‚ฐ์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด ๋Œ€์‹  ๋™์‚ฌ์˜ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜๋ฅผ ์ถ”๊ฐ€ embed ์—์„œ go.mod , ์šฐ๋ฆฌ๋Š” ํŒจํ‚ค์ง€์˜ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜๋ฅผ ์†Œ๊ฐœ ํ•  ์ˆ˜๋Š”์— go.mod ์ˆ˜์ž… ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€, ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•. ๋‹ค์Œ์€ ๋ฐ€์งš๋งจ ์Šค์ผ€์น˜์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€์— ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ .go ํŒŒ์ผ static.go ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์— ์ฃผ์„๊ณผ ํŒจํ‚ค์ง€ ์ ˆ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ํŒจํ‚ค์ง€๋Š” ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ฌ ๋•Œ cmd/go๋Š” ๊ฒฐ๊ณผ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํฌํ•จ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‚ด๋ณด๋‚ธ ๊ธฐ๋Šฅ์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค.

์‹ค์ œ ํŒจํ‚ค์ง€๋ผ๋ฉด internal ๊ทœ์น™์ด ์ ์šฉ๋˜๊ณ  API์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ์•ก์„ธ์Šค ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ์— .go ์•„๋‹Œ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ํ•˜์œ„ ํด๋”(์‹ค์ œ ์ฝ”๋“œ ๊ทœ์น™ ์—†์Œ)๋ฅผ ์ž๋™์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

ํŒจํ‚ค์ง€์— ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ .go ํŒŒ์ผ static.go ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์— ์ฃผ์„๊ณผ ํŒจํ‚ค์ง€ ์ ˆ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ํŒจํ‚ค์ง€๋Š” ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

๋นŒ๋“œ ํƒœ๊ทธ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „์— ์ด ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ”ผํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๊ฐ€ ์ผ๋ถ€ ๋นŒ๋“œ ํƒœ๊ทธ์˜ ๊ฒฝ์šฐ ํ‘œ์ค€ Go ํŒจํ‚ค์ง€๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋‹ค๋ฅธ ํƒœ๊ทธ์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•ด ๋ณด์ด์ง€๋งŒ ์–ด์ฉŒ๋ฉด ๋ฐ”๋žŒ์งํ•œ ์ผ์ผ๊นŒ์š”?

@flimzy
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ํฌํ•จ๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€์™€ ๋™์ผํ•œ fns/vars๋ฅผ ์ •์˜ํ•˜๊ณ  ๋‹ค๋ฅธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ์‹(์›๊ฒฉ์ผ ์ˆ˜ ์žˆ์Œ)์œผ๋กœ ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ƒ์„ฑํ•˜๋Š” ๋นŒ๋“œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ๊ณต๋ฐฑ์„ ์ฑ„์šฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@josharian

ํŒจํ‚ค์ง€์— ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ .go ํŒŒ์ผ static.go ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์— ์ฃผ์„๊ณผ ํŒจํ‚ค์ง€ ์ ˆ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ํŒจํ‚ค์ง€๋Š” ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

์šฐํŽธ ๋ฒˆํ˜ธ ์กฐํšŒ์™€ ๊ฐ™์€ ๊ณ ์œ ํ•œ ๋„๋ฉ”์ธ๋ณ„ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” "๋ฐ์ดํ„ฐ" ํŒจํ‚ค์ง€๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ œ์•ˆํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์›์‹œ ๋ฐ์ดํ„ฐ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋…ผ๋ฆฌ๋ฅผ ํŒจํ‚ค์ง•ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

์šฐํŽธ ๋ฒˆํ˜ธ ์กฐํšŒ์™€ ๊ฐ™์€ ๊ณ ์œ ํ•œ ๋„๋ฉ”์ธ๋ณ„ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” "๋ฐ์ดํ„ฐ" ํŒจํ‚ค์ง€๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

my.pkg/postalcode์˜ ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜๊ณ  my.pkg/postalcode/data(๋˜๋Š” my.pkg/postalcode/internal/data)์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋งค๋ ฅ์ ์ด๋ผ๊ณ  โ€‹โ€‹์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋งŽ์€ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ? ํŒจํ‚ค์ง€์— cmd/go๊ฐ€ ์ถ”๊ฐ€ํ•  ๊ธฐ๋Šฅ๊ณผ ์ถฉ๋Œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? (๋‚˜๋Š” ์ด๊ฒƒ๋“ค์— ๋‹ต์ด ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋Œ€๋‹ตํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

@josharian , ์œ„์˜ ์œ ํ˜• ํ™•์ธ ์ฃผ์„์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค(https://github.com/golang/go/issues/35950#issuecomment-561443566).

@bradfitz ์˜ˆ, ์ด๊ฒƒ์€ ์–ธ์–ด ๋ณ€๊ฒฝ์ด๋ฉฐ go/types ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์–ธ์–ด ๋ณ€๊ฒฝ ์—†์ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. cmd/go๊ฐ€ ์ฑ„์šฐ๋Š” ๋‚ด์šฉ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋ณธ๋ฌธ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด static.go๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

cmd/go๊ฐ€ ์ฑ„์šธ ๋‚ด์šฉ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋ณธ๋ฌธ ์—†๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋ ค๋ฉด static.go๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

catch all embed.File() ๋Œ€์‹  ํŒŒ์ผ๋ณ„ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž์‚ฐ๋ณ„ ๋‚ด๋ณด๋‚ด๊ธฐ ์ œ์–ด๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ƒ์„ฑ๋œ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

EmbededFoo() embed.Asset {...}
embededBar() embed.Asset {...}

4๊ฐœ์›” ์ „์— ์ •์  ํŒŒ์ผ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์„ ์ฐธ๊ณ ํ•˜์„ธ์š” :-)

@josharian

my.pkg/postalcode์˜ ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜๊ณ  my.pkg/postalcode/data(๋˜๋Š” my.pkg/postalcode/internal/data)์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ - ์šฐ์•„ํ•˜์ง€๋งŒ - ๋‚ด ์šฐ๋ ค๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

BC ์šฐ๋ ค๊ฐ€ ์—ฌ๊ธฐ์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ?

์œผ๋กœ embed ์— ๋ฌธ go.mod ?

์•„๋งˆ๋„ ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌป๋Š” ๊ฒƒ์„ ๋”ฐ๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋’ค์ง‘์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋งŒ ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ?

ํŒจํ‚ค์ง€์— cmd/go๊ฐ€ ์ถ”๊ฐ€ํ•  ๊ธฐ๋Šฅ๊ณผ ์ถฉ๋Œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

  1. ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด cmd/go๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  2. cmd/go๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ _existing_ ํŒจํ‚ค์ง€์˜ ์ถฉ๋Œ ๋™์ž‘์€ _undefined_๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    ์ œ์•ˆ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ํŒจํ‚ค์ง€๋กœ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋ฉฐ ๊ธฐ์กด ๋…ผ๋ฆฌ ์ค‘์‹ฌ ํŒจํ‚ค์ง€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฌผ๋ก  ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ์กด ํŒจํ‚ค์ง€์— ์ถ”๊ฐ€ _ํ•  ์ˆ˜_ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ๋™์ž‘์ด ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IOW, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€์šฉ๊ตฌ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด ๋ฏธ์ง€์˜ ์˜์—ญ์— ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ๋“ค์— ๋‹ต์ด ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ต์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋‹ต์ด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š”. ์ ์–ด๋„ ์ง€๊ธˆ๊นŒ์ง€ ํฌ์ฆˆ๋ฅผ ์ทจํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š”.

๊ธฐํ˜ธ ๋˜๋Š” ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ์†”๋ฃจ์…˜์€ ๋ชจ๋“ˆ ๋ฒ”์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€ ๋ฒ”์œ„์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์˜ ์ปดํŒŒ์ผ ๋‹จ์œ„๋Š” ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ€์ ธ์˜ฌ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด go.mod ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dolmen ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์ž์ฒด ํŒจํ‚ค์ง€์— ์žˆ์œผ๋ฉด ๋ฒ”์œ„ ์ž์ฒด๊ฐ€ ๋ชจ๋“ˆ์ด ๋ฉ๋‹ˆ๋‹ค.

@urandom ์•„๋‹ˆ์š”, ๋ฒ”์œ„๋Š” ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ๋‚˜๋Š” ์ „์ฒด ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€๊ฐ€ ์ด ์ œ์•ˆ์˜ ๋ฒ”์œ„์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@urandom ์•„๋‹ˆ์š”, ๋ฒ”์œ„๋Š” ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ๋‚˜๋Š” ์ „์ฒด ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€๊ฐ€ ์ด ์ œ์•ˆ์˜ ๋ฒ”์œ„์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋“  ์ƒ๊ด€์—†์ด ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ํŒจํ‚ค์ง€๊ฐ€ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ž„๋ฒ ๋””๋“œ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ๋ชจ๋“ˆ ์ˆ˜์ค€์—์„œ ์ง€์ •๋˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์ž„๋ฒ ๋””๋“œ ํŒŒ์ผ์ด ๋ชจ๋“ˆ ๋ฒ”์œ„์ด๊ณ  ๋งค์ง ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ถ”๊ฐ€๋˜๋Š” Java ์ƒํƒœ๊ณ„์—์„œ๋„ ์ด์— ๋Œ€ํ•œ ์„ ๋ก€๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ go.mod๋Š” ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ(๋งค์ง ์ฃผ์„ ๋˜๋Š” ๋งค์ง ๋””๋ ‰ํ† ๋ฆฌ ์—†์Œ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์•„์ง ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Go ์†Œ์Šค ์ฒ˜๋ฆฌ ๋„๊ตฌ(์ปดํŒŒ์ผ๋Ÿฌ, ์ •์  ๋ถ„์„๊ธฐ)์šฉ API๋Š” ๋Ÿฐํƒ€์ž„ API๋งŒํผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ API๋Š” ์ƒํƒœ๊ณ„ ์„ฑ์žฅ์— ๋„์›€์ด ๋˜๋Š” Go์˜ ํ•ต์‹ฌ ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค( go/ast / go/format ๋ฐ go mod edit ).

์ด API๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ(ํŠนํžˆ go:generate ๋‹จ๊ณ„์—์„œ)์—์„œ ํฌํ•จ๋˜์–ด ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ˆ˜ ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ go.mod ํŒŒ์‹ฑ( go mod ๋„๊ตฌ) ๋˜๋Š” go/ast ํŒŒ์„œ์—์„œ ๋ณ€๊ฒฝํ•  ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

@๊ณ ์ธ๋Œ

_"๊ธฐํ˜ธ์— ๋Œ€ํ•œ ๊ธฐํ˜ธ ๋˜๋Š” ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ์†”๋ฃจ์…˜์€ ๋ชจ๋“ˆ ๋ฒ”์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€ ๋ฒ”์œ„์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์˜ ์ปดํŒŒ์ผ ๋‹จ์œ„๋Š” ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ go.mod๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉ๋ก์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ฌ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค."_

๋ชจ๋“ˆ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ชจ๋“ˆ์€ _" ๋‹จ์ผ ๋‹จ์œ„๋กœ ํ•จ๊ป˜ ๋ฒ„์ „์ด ์ง€์ •๋œ ๊ด€๋ จ Go ํŒจํ‚ค์ง€์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค ."_ ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ์€ ๋‹จ์ผ ํŒจํ‚ค์ง€๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๊ณ  ๋‹จ์ผ ํŒจํ‚ค์ง€๋Š” ์ „์ฒด ๋ชจ๋“ˆ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ go.mod ๋Š” Go ํŒ€์ด ํŠน์ˆ˜ ์ฃผ์„ ๋ฐ ๋งค์ง ํŒจํ‚ค์ง€๋ณด๋‹ค go.mod ๋ฅผ ์ฑ„ํƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๊ฐ€์ ธ์˜ฌ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ง€์ •ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์ž…๋‹ˆ๋‹ค. Go ํŒ€์ด go.pkg ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Go ํŒ€์ด ํฌํ•จ ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋Š” ์žฅ์†Œ๋กœ go.mod ๋ฅผ ์ˆ˜๋ฝํ–ˆ๋‹ค๋ฉด ํŒŒ์ผ์„ ํฌํ•จํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์€ embed ์ง€์นจ๊ณผ ํ•จ๊ป˜ go.mod ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉฐ ํŒจํ‚ค์ง€ go.mod ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค๋ฅธ go.mod ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ํฌํ•จ๋œ ํŒŒ์ผ์„ ํฌํ•จํ•˜๋ ค๋Š” ํŒจํ‚ค์ง€์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํ•ฉ๋ฒ•์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@mikeschinkel , ๋ชจ๋“ˆ์€ _related_ ํŒจํ‚ค์ง€ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์ „์ด ์ข…์†์„ฑ(๋ฐ ๋ฐ์ดํ„ฐ!)์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ๋ชจ๋“ˆ์—์„œ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค!

๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ๋ณ„์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€๋ณ„ ์ข…์†์„ฑ์ด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋ณ„๋„์˜ ๋ชจ๋“ˆ ์ˆ˜์ค€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bcmills

๋ฉ”์‹œ์ง€์˜ '๋ฐ์ดํ„ฐ ํŒŒ์ผ'์„ '๋ชจ๋“ˆ'๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ ์œ ํšจํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ž์‹ ์˜ ํŠน์ • ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ข…์†์„ฑ์œผ๋กœ ํŠน์ • ๋ชจ๋“ˆ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ go.mod์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

@urandom , go.mod ํŒŒ์ผ์— ํ‘œ์‹œ๋œ ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ์ตœ์ข… ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋งํฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ( go.mod ํŒŒ์ผ์— ์ข…์†์„ฑ์„ ๋„ฃ๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์ข…์†์„ฑ์„ ํ”„๋กœ๊ทธ๋žจ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ _not_ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.)

๋ฉ”ํƒ€ ํฌ์ธํŠธ

์ด๊ฒƒ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋ฉฐ, ์ƒ๋‹จ์— ์žˆ๋Š” Brad์˜ ์›๋ž˜ ์˜๊ฒฌ์€ ์ดˆ๊ธฐ ์Šค์ผ€์น˜/์ถœ๋ฐœ์ /ํ–‰๋™ ์ด‰๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค ๋œ ์™„์„ฑ๋œ ์ œ์•ˆ์„œ์˜€์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์ด ํŠน์ • ํ† ๋ก ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  Brad์™€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋ช‡ ์‚ฌ๋žŒ์ด ์„ธ๋ถ€ ์„ค๊ณ„ ๋ฌธ์„œ์— ๋Œ€ํ•ด ํ˜‘๋ ฅํ•˜๋„๋ก ํ•œ ๋‹ค์Œ ํ•ด๋‹น ํŠน์ •(์•„์ง ์ž‘์„ฑ๋˜์ง€ ์•Š์€) ๋ฌธ์„œ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. . ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์†Œ ๊ฑฐ์ฐฝํ•œ ๋Œ€ํ™”๊ฐ€ ๋œ ๋‚ด์šฉ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ?

์ด ๋ฌธ์„œ๋ฅผ ๋‹ซ๋Š” ๋ฐ ๋™์˜ํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์„ค๊ณ„ ๋ฌธ์„œ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ œ์•ˆ์„ ๋ณด๋ฅ˜ํ•˜๊ณ  ์˜๊ฒฌ์„ ์ž ์‹œ ์ž ๊ธ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ๋Œ“๊ธ€์ด ์ค‘๋ณต๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ์„ ๋Œ“๊ธ€์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์‹œ์ ์—์„œ ๊ฑฐ์˜ ๋ชจ๋“  ๋Œ“๊ธ€์ด ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค...)

๋””์ž์ธ ๋ฌธ์„œ๊ฐ€ ์žˆ์œผ๋ฉด ์ด ๋ฌธ์„œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ด ํ•ญ๋ชฉ์„ ๋‹ซ๊ณ  #3035(๋Œ“๊ธ€์ด ๊ณ ์ •๋œ ์ƒํƒœ)๋ฅผ ๋‹ค์‹œ ์—ด์–ด์„œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์ถ”์ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋‹ซ๊ธฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•œ ์งํ›„์— ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•˜์ง€๋งŒ @bcmills ๋Œ“๊ธ€ ์งํ›„์™€ ๋‚ด๊ฐ€ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์ „์— ๊ธด๋ฐ€ํ•œ ํ† ๋ก ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

"_๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด์—์„œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์ „์ด์  ์ข…์†์„ฑ(๋ฐ ๋ฐ์ดํ„ฐ!)์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ๋ชจ๋“ˆ์—์„œ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค."_

์˜ˆ, ๋ถ„๋ช…ํžˆ _๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค._ ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ชจ๋“ˆ์šฉ ๋‹จ์ผ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ์— go.mod ๊ฐ€ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋œ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ๋˜ ๋‹ค๋ฅธ go.mod ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ข‹์€ ๊ฒƒ์€ go.mod ๋กœ ์‹๋ณ„๋˜๋ฉฐ ๋ณธ์งˆ์ ์œผ๋กœ ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ž„๋ฒ ๋“œ ํŒŒ์ผ์„ ์ง€์ •ํ•˜๊ธฐ์— ์™„๋ฒฝํ•œ ์žฅ์†Œ์ธ ๊ฒƒ์œผ๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ ๊ตฌ์„ฑ ์š”์†Œ.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ Go์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
๋ชจ๋“ˆ์€ ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฒ„์ „์ด ์ง€์ •๋˜๋Š” ํŒจํ‚ค์ง€ ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค.
๋ชจ๋“ˆ์€ ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€์˜ ์˜๋ฏธ ์™ธ์— ์ถ”๊ฐ€ ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๊ทธ๋“ค์˜ ๋‹จ์ˆœํ•จ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋””๋กœ ๊ฐ€๋“ ์ง€ ์ˆ˜ํ–‰๋˜๋“  ๊ฐ„์— (์‚ฌ์šฉ๋œ ํŒจํ„ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ) go list๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„๋ฒ ๋“œ๋  ๋ชจ๋“  ์ž์‚ฐ ๋ชฉ๋ก์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Brad์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ณต์‹์ ์ธ ๋””์ž์ธ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๊นŒ์ง€ ๋ณด๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ static ๋˜๋Š” embed ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ํŒŒ์ผ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋Š” ๊ทธ๊ฒƒ์„ ์กฐ๊ธˆ ๋ณต์žกํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ๋ชจ๋“ˆ ์™ธ๋ถ€์— ๋˜๋Š” GOPATH์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€ ์™ธ๋ถ€์— ์–ด๋–ค ๊ฒƒ๋„ ํฌํ•จํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŠนํžˆ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ์ฃผ์„์˜ ํŒฌ์€ ์•„๋‹ˆ์ง€๋งŒ ์ปดํŒŒ์ผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์˜์‚ฌ ํŒจํ‚ค์ง€๋„ ์•ฝ๊ฐ„ ์ด์ƒํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์ผ์ข…์˜ embed ์ตœ์ƒ์œ„ ์„ ์–ธ์„ ์–ธ์–ด์— ์‹ค์ œ๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๋กœ์ปฌ ๊ฒฝ๋กœ๋งŒ ์ง€์›ํ•˜๋ฉฐ ํ• ๋‹นํ•  ์ด๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

embed ui "./ui/build"

func main() {
  file, err := ui.Open("version.txt")
  if err != nil {
    panic(err)
  }
  version, err = ioutil.ReadAll(file)
  if err != nil {
    panic(err)
  }
  file.Close()

  log.Printf("UI Version: %s\n", bytes.TrimSpace(version))
  http.ListenAndServe(":8080", http.EmbeddedDir(ui))
}

ํŽธ์ง‘: @jayconrod, ๋‹น์‹ ์ด ์ €๋ฅผ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊นจ๋—ํ•˜๊ณ  ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ go ํŒ€์ด ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” "์ •์ "๊ณผ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์ฃผ์„์ด ํ•„์š” ์—†์ด API๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

static ๋ฅผ ํŠน๋ณ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์ €๋Š” assets ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์Šค๋ ˆ๋“œ์—์„œ ๋ณด์ง€ ๋ชปํ•œ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” assets ๋ฅผ ํŒจํ‚ค์ง€๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: import "example.com/internal/assets" . ๋…ธ์ถœ๋œ API๋Š” ์—ฌ์ „ํžˆ ๋””์ž์ธ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ ์–ด๋„ ํŠน๋ณ„ํ•œ ์ฃผ์„์ด๋‚˜ ์ƒˆ๋กœ์šด runtime/files ์Šคํƒ€์ผ ํŒจํ‚ค์ง€๋ณด๋‹ค ๋” ๊น”๋”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ์—์„œ ๋ณด์ง€ ๋ชปํ•œ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” ์ž์‚ฐ์„ ํŒจํ‚ค์ง€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/golang/go/issues/35950#issuecomment -562966654์—์„œ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋ณต์žกํ•œ ์ ์€ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๋ฐœ์ƒ ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์–ธ์–ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜

๋น„์Šทํ•œ ์ƒ๊ฐ์ด์ง€๋งŒ static.go ๋””์ž์ธ์€ ์ž„์˜์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด assets ๋””๋ ‰ํ† ๋ฆฌ๋Š” testdata , internal ๋˜๋Š” vendor ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค assets ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ์š”๊ตฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” Go ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฌธ์„œ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ runtime/files -thingy API์™€ ๊ฒฐํ•ฉ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์›์‹œ import ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ํŒŒ์ผ์— ํฌํ•จํ•œ ๋‹ค์Œ ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๋Ÿฐํƒ€์ž„ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. os.Open ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฐ›์•„ ๋“ค์—ฌ์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

shurcooL/vfsgen ํ•จ๊ป˜ shurcooL/httpgzip ์••์ถ• ํ•ด์ œ ์—†์ด ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ

    rsp.Header().Set("Content-Type", "image/png")
    httpgzip.ServeContent(rsp, req, "", time.Time{}, file)

์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์ด C++์— ๋Œ€ํ•ด ์ œ์•ˆ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. std::embed :

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1040r0.html
https://mobile.twitter.com/Cor3ntin/status/1208389050698215427

๋””์ž์ธ์— ์˜๊ฐ์„ ์ฃผ๊ณ  ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒํ‹ฐ์— ์กฐ๊ธˆ ๋Šฆ์—ˆ์ง€๋งŒ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ์ฃผ์„ ๋Œ€์‹ , ๊ณ ์ •๋œ ํŠน์ˆ˜ ๋””๋ ‰ํ† ๋ฆฌ(์ •์ ), ๋˜๋Š” go.mod๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ช…๋ฐฑํžˆ ๊ธˆ์ง€๋œ ์ ‘๊ทผ ๋ฐฉ์‹: ํŒจํ‚ค์ง€๋‹น ์ƒˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ: go.res

  • ํŒŒ์ผ ๋ชฉ๋ก์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋‚˜ ๊ธ€๋กœ๋ธŒ๊ฐ€ ์—†๊ณ  ํ˜„์žฌ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ด๋ฆ„๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— glob์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • __Edit__๋Š” go ํŒŒ์ผ์ฒ˜๋Ÿผ ๋งจ ์œ„์— package mypackagename ํ–‰ ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํŒŒ์ผ ์ด๋ฆ„์— ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: mypackagename.go.res). ๊ฐœ์ธ์ ์œผ๋กœ package ํ—ค๋” ๋ผ์ธ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

  • "resource" ๋˜๋Š” "io/resource"๋ผ๋Š” ์ƒˆ๋กœ์šด ํ•ต์‹ฌ ํŒจํ‚ค์ง€. ํ˜„์žฌ ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฝ๋Š” func Read(name string) (io.Reader, bool) ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ์Šต๋‹ˆ๋‹ค.

    • __Edit__ ํ•ต์‹ฌ ํŒจํ‚ค์ง€๊ฐ€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€ ๊ฐœ์ธ ํ•จ์ˆ˜์—ฌ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: func readresource(name string) (io.Reader, bool) ).

  • ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด go.res ํŒŒ์ผ๊ณผ ํ•˜๋‚˜ ์ด์ƒ์˜ .go ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. go ํŒŒ์ผ์€ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ ํŒจํ‚ค์ง€์˜ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ ๊ณต๊ฐœ API๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ๋ฆฌ์†Œ์Šค๋Š” ์˜๋„์ ์œผ๋กœ ์ž๋™์œผ๋กœ ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— go ํŒŒ์ผ๊ณผ ๋‚ด๋ณด๋‚ธ API๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • __Edit__ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ฐ/๋˜๋Š” ์••์ถ•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ tar ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•œ ์›นํŒฉ ๋ฒˆ๋“ค๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์ „ ์••์ถ•์˜ ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ). ๊ทธ๋“ค์„ ํƒ€๋ฅด๋กœ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • __Edit__ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์‹ญ๋‹ˆ๊นŒ? go.res ํŒŒ์ผ ์ž์ฒด๋ฅผ ๋ฆฌ์†Œ์Šค๋กœ ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. listresources ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ. ์ƒˆ ํŒŒ์ผ ํ•˜๋‚˜. ๊ฒฝ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์••์ถ• ์—†์Œ. ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅ. ๋ฆฌ๋”๋ฅผ ํ†ตํ•œ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค(๊ทธ๋Ÿฌ๋‚˜ ํ–ฅํ›„ ๋Œ€์ฒด ์•ก์„ธ์Šค ํŒจํ„ด์— ๊ฐœ๋ฐฉ๋จ). ๊ธฐ์กด ํŒจํ‚ค์ง€๋ฅผ ๊นจ๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์ œ๋กœ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ ํ•ต์‹ฌ ๊ตฌ์„ฑ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

__Edit__ github ๊ฒ€์ƒ‰ language:go filename:go.res extension:res ํ›„ go.res ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฝค ์•ˆ์ „ํ•œ ํŒŒ์ผ ์ด๋ฆ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. go repos์—๋Š” ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๊ณ  non-go repos์—๋Š” ๋ช‡ ๊ฐœ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

@chris.ackermanm์ด๋ผ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์กฐํ•ฉ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค:

๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” go.res ํŒŒ์ผ.

์ด๊ฒƒ์€ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๋‹ค๋ฅธ ํ•œ ๋‹ค์ค‘ ํฌํ•จ
  • ์ด์ „์— ํŒŒ์ผ์„ ๋ชจ๋ฅด๊ณ  ๋ชฉ๋ก์„ ์ƒ์„ฑํ•ด์•ผ ํ•จ

ํ›„์ž๋Š” ์—…๋ฐ์ดํŠธ, ๋‹ค๋ฅธ ์˜ต์…˜, ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์œผ๋กœ ์ธํ•ด ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” webpack ๋“ฑ์˜ ์ถœ๋ ฅ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์••์ถ•๊ณผ ๊ด€๋ จํ•˜์—ฌ: ์ด์ง„ ํฌ๊ธฐ๊ฐ€ ํญ๋ฐœํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ ์ฝ”๋“œ์— ํˆฌ๋ช…ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฌ์ž‘์„ฑ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

filename => stored-as.png

๋‚ด 2ยข

@sascha-andres ์ด ์Šค๋ ˆ๋“œ์˜ ํ†ค์€ ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ณ  ๋งˆ๋ฒ•์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋งคํ•‘์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š” ์—†์Œ. ๊ทธ๊ฒƒ์€ ์–ด์จŒ๋“  ๋ณ„๋„์˜ ํŒจํ‚ค์ง€์—์„œ ์ž์‹ ์˜ ์ฝ๊ธฐ ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด์ œ ์ƒˆ๋กœ์šด ํŒŒ์ผ ๊ตฌ๋ฌธ ๋˜๋Š” ํŒŒ์ผ๋‹น ํŒŒ์ผ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”

์ด ์ œ์•ˆ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ž์‚ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GNU bintools ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ๋”๋Ÿฝ์ง€ ๋งŒ ์ง€๊ธˆ์€ ์ €์—๊ฒŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋ ๊นŒํ•ด์„œ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์€ objcopy๊ฐ€ ์žˆ๋Š” elf/pe32 ์„น์…˜์— ๋‚ด ์ž์‚ฐ(tar&gz๋กœ ์••์ถ•)์„ ํฌํ•จํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ zip๊ณผ ํ•จ๊ป˜ debug/elf ๋ฐ debug/pe32 ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ฒƒ์€ ๊ธฐ์กด ์„น์…˜์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž์‚ฐ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ”๋“œ๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์–ธ์–ด ๋””์ž์ธ์ด๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ ๋””์ž์ธ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  .goassets ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์„น์…˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์••์ถ•์„ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์€ objcopy๊ฐ€ ์žˆ๋Š” elf/pe32 ์„น์…˜์— ๋‚ด ์ž์‚ฐ(tar&gz๋กœ ์••์ถ•)์„ ํฌํ•จํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ zip๊ณผ ํ•จ๊ป˜ debug/elf ๋ฐ debug/pe32 ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ฝ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ฒƒ์€ ๊ธฐ์กด ์„น์…˜์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž์‚ฐ์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ”๋“œ๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

elf / pe32 ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ mach-o / plan9 ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ํŒŒ์ผ ํ•ธ๋“ค์„ ์—ฌ๋Š” ๋ฐ ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ํŒŒ์ผ์ด ๋ฎ์–ด์“ฐ๊ธฐ/์—…๋ฐ์ดํŠธ/์‚ญ์ œ๋œ ๊ฒฝ์šฐ ํ•ฉ๋ฒ•์ ์ธ ๋ฌธ์ œ์ธ์ง€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ธฐ๋Šฅ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ/macho๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ๊ฐ„์˜ ์‹œ๋„๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์ด ๊ต์ฐจ ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. macOS์—์„œ ๋นŒ๋“œ ์ค‘์ด๊ณ  ์„ค์น˜๋œ GNU binutils๊ฐ€ mach-o-x86-64 ๋ฅผ ์†์ƒ์‹œํ‚จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. mach-o ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  objcopy ๋ณธ ์ดํ›„๋กœ ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Œ).

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์‹คํ–‰ ํŒŒ์ผ์—์„œ ํŒŒ์ผ ํ•ธ๋“ค์„ ์—ฌ๋Š” ๋ฐ ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ๋กœ๋”๊ฐ€ ๋ฆฌ์†Œ์Šค ์„น์…˜์„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋“œ(๋˜๋Š” ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ)ํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊ทธ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฐœ์ฒด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Java ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ํฐ ์ผ์„ ์š”๊ตฌํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • go.res ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก go.mod ์ˆ˜์ •
  • ์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์€ ์ž๋™์œผ๋กœ ํฌํ•จ๋˜๋ฉฐ ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•œ ์˜ˆ์™ธ ๊ฐ€
  • ์–ธ์–ด๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ์™€ ์œ ์‚ฌํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์••์ถ• ๋“ฑ์€ ์ด ๋ฆฌ์†Œ์Šค ๋ฒˆ๋“ค๋ง ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์•ผ ํ•˜๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ // go:generate ์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ markbates/pkger๋ฅผ ๋ณด์…จ์Šต๋‹ˆ๊นŒ ? go.mod ๋ฅผ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. index.html ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด pkger.Open("/index.html") ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— static/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๊ฒƒ์ด ๋” ๋‚˜์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ Go์—๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ๊ตฌ์กฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†๋‹ค๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. go.mod ๋Š” ํŒŒ์ผ์ผ ๋ฟ์ด๊ณ  vendor/ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ static/ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ldflags ๋งํฌ ํ”Œ๋ž˜๊ทธ -X importpath.name=value ๋ฅผ ํ†ตํ•ด (์ œํ•œ์ ์ด๊ธด ํ•˜์ง€๋งŒ) ๋ฐ์ดํ„ฐ๋ฅผ ๋นŒ๋“œ์— ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์กฐ์ •ํ•˜์—ฌ -X importpath.name=@filename ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์™ธ๋ถ€ ์ž„์˜ ๋ฐ์ดํ„ฐ?

์ด๊ฒƒ์ด ์›๋ž˜ ๋ฌธ์ œ์˜ ๋ช…์‹œ๋œ ๋ชฉํ‘œ๋ฅผ ๋ชจ๋‘ ๋‹ค๋ฃจ์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ธฐ์กด -X ๊ธฐ๋Šฅ์˜ ํ™•์žฅ์œผ๋กœ์„œ ํ•ฉ๋ฆฌ์ ์ธ ๋‹จ๊ณ„๋กœ ๋ณด์ž…๋‹ˆ๊นŒ?

(๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ldflags -X ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๋” ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ go.mod ๊ตฌ๋ฌธ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ ๋‹ค์Œ ๋‹จ๊ณ„์ž…๋‹ˆ๊นŒ?)

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ง€๋งŒ ๋ณด์•ˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

-X 'pkg.BuildVersion=$(git rev-parse HEAD)' ๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ํ”ํ•œ ์ผ์ด์ง€๋งŒ go.mod ๊ฐ€ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š๊ฒ ์ฃ ? (go generate๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•œ OSS ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.) go.mod๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฉด ๊ฒฐ๊ตญ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ˆ„๋ฝ๋˜๋ฏ€๋กœ ldflags๋Š” ์—ฌ์ „ํžˆ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ @filename ๊ฐ€ /etc/passwd ๋˜๋Š” ๋ฌด์—‡์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ง์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด WASM ๋ฐ ๋ง์ปค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋Œ€์ƒ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ฐฐ์ œ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณ ์•ˆ ํ–ˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ ๋ฐฉ์‹ ์ค‘ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ์•ˆ ๋””์ž์ธ ๋ฌธ์„œ, ๋น„๋””์˜ค ๋ฐ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ๋งํฌ). ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜๊ฒฌ ๋Œ€์‹  Reddit Q&A๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŠน์ • ์ดˆ์•ˆ ๋””์ž์ธ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค. Reddit ์Šค๋ ˆ๋“œ ๋ฐ GitHub๋ณด๋‹ค ๋” ๋‚˜์€ ํ† ๋ก  ๊ทœ๋ชจ. ๊ฐ์‚ฌ ํ•ด์š”!

๋™์˜์ƒ: https://golang.org/s/draft-embed-video
๋””์ž์ธ: https://golang.org/s/draft-embed-design
Q&A: https://golang.org/s/draft-embed-reddit
์ฝ”๋“œ: https://golang.org/s/draft-embed-code

@rsc ์ œ ์ƒ๊ฐ์— go:embed ์ œ์•ˆ์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— _universal_ ์ƒŒ๋“œ๋ฐ•์Šค ์ฒ˜๋ฆฌ๋œ Go ์ฝ”๋“œ ์‹คํ–‰์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ด๋“ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŒŒ์ผ ์ฝ๊ธฐ์™€ ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ _์ตœ์  ํ˜•์‹_์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@atomsymbol ๊ทธ๊ฒƒ์€ ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@atomsymbol ๊ทธ๊ฒƒ์€ ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค.

์ œ์•ˆ์„œ๋ฅผ ์ฝ๊ณ  ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ–ˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž„๋ฒ ๋”ฉ ๋ฐฉ์‹์— ๋””์Šคํฌ์˜ ํŒŒ์ผ(~os.Stat)์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ๋นŒ๋“œ ์‹œ๊ฐ„์œผ๋กœ ์žฌ์„ค์ •๋ฉ๋‹ˆ๊นŒ? ์–ด๋Š ์ชฝ์ด๋“ , ์ด๋“ค์€ ๋‹ค์–‘ํ•œ ์žฅ์†Œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์œ ์šฉํ•œ ์กฐ๊ฐ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ž์‚ฐ์— ๋Œ€ํ•ด 304๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

ํŽธ์ง‘: reddit ์Šค๋ ˆ๋“œ์—์„œ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํฌํ•จ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‹œ๊ฐ„์€ ๊ท€ํ•˜๊ฐ€ ๋‚˜์—ดํ•œ ์žฌํ˜„์„ฑ ๋ฌธ์ œ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” 0์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. (๋ชจ๋“ˆ์€ ๊ฐ™์€ ์ด์œ ๋กœ ์ˆ˜์ • ์‹œ๊ฐ„๋„ ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

https://old.reddit.com/r/golang/comments/hv96ny/qa_goembed_draft_design/fytj7my/

์–ด๋Š ์ชฝ์ด๋“ , ์ด๋“ค์€ ๋‹ค์–‘ํ•œ ์žฅ์†Œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์œ ์šฉํ•œ ์กฐ๊ฐ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ž์‚ฐ์— ๋Œ€ํ•ด 304๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋ฐ์ดํ„ฐ ํ•ด์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ETag ํ—ค๋”๋Š” ๋‚ ์งœ์— ๋Œ€ํ•ด ์•Œ ํ•„์š” ์—†์ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ http.HandlerFS ๋˜๋Š” ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ํŒŒ์ผ๋‹น ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ http.HandlerFS ๋˜๋Š” ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ํŒŒ์ผ๋‹น ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

http.HandlerFS๋Š” fs.FS๊ฐ€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? IsImmutable() bool ์˜ต์…˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

http.HandlerFS๋Š” fs.FS๊ฐ€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? IsImmutable() bool ์˜ต์…˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์˜ ๋””์ž์ด๋„ˆ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋“ค์–ด๊ฐ€๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์ง€๋งŒ http.HandlerFS๋Š” ๊ทธ๊ฒƒ์ด embed.FS ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•˜๊ณ  ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ ์กฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ FS API๋ฅผ ํ™•์žฅํ•˜์‹ญ์‹œ์˜ค. HandlerFS์— ์˜ต์…˜ ์ธ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ์ˆ˜ํ–‰๋˜๊ณ  ๋ชจ๋“  ctime/mtime์˜ ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ handlerFS๋Š” ํ•ด๋‹น ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ "์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ" mtime์ด ์—†๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”๋œ ํŒŒ์ผ ์‹œ์Šคํ…œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋Œ“๊ธ€์„ ๋ณด์ง€ ์•Š์•˜๋‹ค.

@atomsymbol ๋‹ค์‹œ ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๊ธฐ ๋Œ“๊ธ€ ๋‹ค์‹œ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘๋„ค์š”.
๋‚˜๋Š” ์›์น™์ ์œผ๋กœ ์ƒŒ๋“œ๋ฐ•์‹ฑ์ด ์žˆ๋‹ค๋ฉด ๋งŽ์€ ์ผ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ƒŒ๋“œ๋ฐ•์‹ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. :-)

@kokes ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ HTTP๋ฅผ ํ†ตํ•ด embed.Files๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ETag๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” 7์›”์— ๋‹ค์‹œ ๊ฒŒ์‹œ๋œ ๋””์ž์ธ ์ดˆ์•ˆ์„ ์ˆ˜๋ฝํ•˜๊ธฐ ์œ„ํ•ด #41191์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ๋กœ ๋Œ€์ฒด๋˜์–ด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ํ›Œ๋ฅญํ•œ ์˜ˆ๋น„ ํ† ๋ก ์„ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰