์ ์ ์์ฐ ํ์ผ์ ๋ฐ์ด๋๋ฆฌ์ ํฌํจํ๋ ๋ง์ ๋๊ตฌ๊ฐ ์์ต๋๋ค.
์ค์ ๋ก https://tech.townsourced.com/post/embedding-static-files-in-go/๊ฐ ๋ ๋ง์ด ๋์ด๋ฉ๋๋ค.
์ด ์์ ์ ํ ๋ฒ ์ ์ํํ๊ณ ์ค๋ณต์ ์ค์ด๊ณ ํ์ผ ๋ฆฌ์์ค๋ฅผ cmd/go ๋๊ตฌ์ ํฌํจํ๋ ๊ณต์ ์ง์์ ์ถ๊ฐํด์ผ ํ ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
go install
-able์ด ์๋๊ฑฐ๋ ์ฌ๋๋ค์ด ์์ ์ Makefile์ ์์ฑํ๊ฒ ๋ง๋๋ ๋ฑ์ ์๋ฏธํฉ๋๋ค.go install
/ go build
์๋์ผ๋ก ์๋ฒ ๋ฉ ์ํ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/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(์์ ๋งํฌ๋จ)์๋ ํ๋์ ํฐ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์๋ ์ฆ๋ถ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ด๋ ๋ฐ ์ข์ ์ด๋ฌํ ๋ชจ๋๊ฐ ์์ต๋๋ค.
../../../../../../../../../../etc/shadow
ํฌํจ ์ฐจ๋จ.git
์ ๋๋ฌํ๋ ๊ฒ์ ์ฐจ๋จํ ์๋ ์์ต๋๋ค.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๊ฐ ์ ํ ํ์ํ์ง ์์ต๋๋ค.
๋ช ๊ฐ์ง ์๊ฐ:
//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 ์ฝ๋โ ๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฏ๋ก _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์ ๋ฌธ์์ด๊ณผ ํจ๊ป ์๋ํฉ๋๋ค.
์, ์ด์ํ ๊ฒ์ ๋๋ค. ๋ ์๊ฐ ์๋ ๊ฒฝ๋ก ์ด๋ฆ์ผ๋ก ํ์ผ๋ง ์ฌ์ฉํฉ๋๋ค. ๋ ๊ฐ์ง ์๋ต:
ํฌํจ๋ ๋ฐ์ดํฐ์ Bytes() []byte
๋ฐ String() string
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค.
๋ชจ๋ ๋จ์ผ ์์ฒญ์ ๋ํด ํ ํ๋ฆฟ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฐ๋ฉด์ 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 ๋๋ ์ด์ ์์ํ๋ ๊ฒ์ผ๋ก ์์ถ๋ ์ ์๋ค๋ฉด ๊ฐ์ธ์ ์ผ๋ก ๊ธฐ์ ๊ฒ์ ๋๋ค. ๋ฐ์ด๋๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์์ถ ํด์ ๋๊ณ ๋ชจ๋ ๊ฒ์ด ์๋ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ฐ์ ์ ์ผ๋ก ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์๊ฐ:
package embed
์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ญ๋๋ค.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
๋์ฌ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํฌํจ๋ ํ์ผ์ ํน๋ณํ ์ฃผ์์ด๋ ๋งค์ง ํจํค์ง๊ฐ ์๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ Go ํ๋ก์ ํธ์์ go.mod
ํ์ผ์ ๊ฐ๋ฐ์๊ฐ ํ์ํ ๋ชจ๋/ํ์ผ์ ์ง์ ํ ์ ์๋ ๊ณณ์ด๋ฏ๋ก ํฌํจ์ ์ง์ํ๋๋ก ํ์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฒ๋ค๊ฐ, ์๋ฒ ๋๋ ํ์ผ ๋ชจ์์ ์ผํ์ฑ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ Go ํ๋ก์ ํธ์ ์์๋ก ์ถ๊ฐ๋๋ ๊ฒ๋ณด๋ค ํจํค์ง๊ฐ ํฌํจ๋ ์ ์๋ค๋ฉด ๋ ๊ฐ์น ์๊ณ ์ฌ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ ์์ด๋์ด๋ ์๋ฒ ๋๋๊ฐ ํจํค์ง๋ก ๊ตฌํ๋๋ฉด ์ฌ๋๋ค์ด Github์ ํตํด ๊ฐ๋ฐํ๊ณ ๊ณต์ ํ ์ ์๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ค์์ ํฌํจํ๋ GitHub์ ์ปค๋ฎค๋ํฐ ์ ์ง ๋ฐ ๋ฌด๋ฃ ์ฌ์ฉ ํจํค์ง๋ฅผ ์์ํด ๋ณด์ญ์์ค.
NS. ๊ฐ ํ์ผ์ ํด๋น ๊ตญ๊ฐ์ ๋ชจ๋ ์ฐํธ ๋ฒํธ๊ฐ ํฌํจ๋ ๊ตญ๊ฐ์ ํ์ผ,
NS. ๋ธ๋ผ์ฐ์ ์๋ณ์ ์ํด ์๋ ค์ง ๋ชจ๋ ์ฌ์ฉ์ ์์ด์ ํธ ๋ฌธ์์ด์ด ํฌํจ๋ ํ์ผ,
์จ. ์ธ๊ณ ๊ฐ๊ตญ์ ๊ตญ๊ธฐ ์ด๋ฏธ์ง,
NS. Go ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ค๋ช
ํ๋ ์ฌ์ธต ๋์๋ง ์ ๋ณด,
์ด์ํ. ๋ฑ๋ฑ...
ํจํค์ง์์ ํ์ผ์ ์ด๊ณ ์ฝ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ 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: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๊ฐ ์ถ๊ฐํ ๊ธฐ๋ฅ๊ณผ ์ถฉ๋ํ๋ ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น?
์ ์๋ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด cmd/go๊ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
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
package mypackagename
ํ ํ๋๋ง ํ์ํ ์ ์์ต๋๋ค. ๋๋ ํ์ผ ์ด๋ฆ์ ํจํค์ง ์ด๋ฆ์ ํฌํจํ ์ ์์ต๋๋ค(์: mypackagename.go.res). ๊ฐ์ธ์ ์ผ๋ก package
ํค๋ ๋ผ์ธ์ด ๋ ์ข์ต๋๋ค.func Read(name string) (io.Reader, bool)
ํจ์๊ฐ ํ๋ ์ด์ ์์ต๋๋ค.func readresource(name string) (io.Reader, bool)
)..go
ํ์ผ์ ์ถ๊ฐํ์ฌ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ํจํค์ง๋ก ๋ง๋์ญ์์ค. go ํ์ผ์ ํ์ ๋๋ ํ ๋ฆฌ ํจํค์ง์ ๋ฆฌ์์ค์ ์ก์ธ์คํ๊ธฐ ์ํด ๊ณ ์ ํ ๊ณต๊ฐ API๋ฅผ ๋ด๋ณด๋
๋๋ค. ๋ค๋ฅธ ํจํค์ง์ ๋ฆฌ์์ค๋ ์๋์ ์ผ๋ก ์๋์ผ๋ก ๋ด๋ณด๋ด์ง์ง ์๊ธฐ ๋๋ฌธ์ go ํ์ผ๊ณผ ๋ด๋ณด๋ธ API๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์ ์ง์ ํ ์๋ ์์ต๋๋ค.๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํ๋์ ์๋ก์ด ๊ธฐ๋ฅ. ์ ํ์ผ ํ๋. ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค. ์์ถ ์์. ์๋ก์ด ๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ๋ง๋ฒ์ด ์์ต๋๋ค. ํ์ฅ ๊ฐ๋ฅ. ๋ฆฌ๋๋ฅผ ํตํ ์ฝ๊ธฐ ์ ์ฉ ์ก์ธ์ค(๊ทธ๋ฌ๋ ํฅํ ๋์ฒด ์ก์ธ์ค ํจํด์ ๊ฐ๋ฐฉ๋จ). ๊ธฐ์กด ํจํค์ง๋ฅผ ๊นจ๋จ๋ฆด ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์ ๋ก์ ๊ฐ๊น์ต๋๋ค. ํจํค์ง๊ฐ ํต์ฌ ๊ตฌ์ฑ์ธ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
__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
์์ ์์ถ ๋ฑ์ ์ด ๋ฆฌ์์ค ๋ฒ๋ค๋ง ๋ฒ์๋ฅผ ๋ฒ์ด๋์ผ ํ๋ฉฐ ํ์ํ ๊ฒฝ์ฐ // 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์ ์ ์ถํ์ต๋๋ค.
๋๋ ๊ทธ ๋ฌธ์ ๋ก ๋์ฒด๋์ด ์ด ๋ฌธ์ ๋ฅผ ๋ซ์ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์์ ํ๋ฅญํ ์๋น ํ ๋ก ์ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@robpike ์ ์ ๋ ๋ช ๋ ์ (์ ์ ์ ์ฐจ๊ฐ ์๊ธฐ ์ ) ์ ์์ ํตํด ์ด์ผ๊ธฐ๋ฅผ
๋๋ "์์ถ ๋ ๋น"๋ ธ๋ธ์ ๋ณต์ก์ฑ์ ๋ํด ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ๋๋ค์ ์์ถ, ์์ถ ์์ค ๋ฑ์ ์ ์ดํ ์ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ถ๊ฐํด์ผ ํ ๊ฒ์ ์ผ๋ฐ ๋ฐ์ดํธ ํ์ผ์ ํฌํจํ๋ ๊ธฐ๋ฅ๋ฟ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋น ํ์ผ์ ์์ถ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ค๋ ๊ฒฝ์ฐ ์ธ๋ถ ์ฌํญ์ ์ฌ์ฉ์์๊ฒ ๋ฌ๋ ค ์์ผ๋ฉฐ Go ์ธก์์๋ API๊ฐ ์ ํ ํ์ํ์ง ์์ต๋๋ค.