Fable 3๋ ์ด๊ธฐ์ F# ์์ค ๋งต ์ง์ ์์ด ์ถ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์ง๋ง(๋ ์ฝ๊ธฐ ์ฌ์ด JS ์ถ๋ ฅ์ผ๋ก ์ด๋ฅผ ๋ณด์ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์) ์ด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ธํ๋ผ ๋ ์ฌ์ ํ ์ ์๋ฆฌ์ ์์ต๋๋ค. Fable 3๋ "์์ํ" dotnet ์ฑ์ด๋ฏ๋ก ์์ค ๋งต์ ์์ฑํ๋ ค๋ฉด dotnet ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ์ง๋ง ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๊ฒ์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์๋ง๋ Mozilla JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค๋งต ์์ฑ๊ธฐ๋ฅผ dotnet (F# ๋๋ C#)์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. ์ปค๋ฎค๋ํฐ์์ ๋์์ ์ค ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
Fable 3๋ ๋ ์ด์ fable-compiler
ํจํค์ง( fable-loader
์ ํจ๊ป ์ฌ์ฉ๋จ)๋ฅผ ํตํด ๋ฐฐํฌ๋์ง ์์ต๋๊น? ๐ฑ ์์ Fable ์ฑ์ด node.js ์ฑ์ ๋ง๋ค๊ธฐ ์ํด Fable-splitter๋ณด๋ค ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ง๋ง npm ๋ฐฐํฌํ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ชจ๋ ๊ณณ์์ ํฐ ๋ณํ๊ฐ ๋ ๊ฒ์ด๋ฉฐ ์์งํ ํ
ํ๋ฆฟ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ด ์์
ํ๋ ๋ฐ ์ฝ๊ฐ์ ๊ณ ํต์ด ๋ ๊ฒ์ด๋ผ๋ ์ ์ ์ดํดํฉ๋๋ค. ๋ฐ ํ๋ก์ ํธ. npm upgrade fable-compiler
๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฝ์ต๋๋ค.
๋ก์ปฌ ๋๊ตฌ์ ๋ฒ์ ๊ณ ์ ์ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ชจ๋ F# ๋๊ตฌ(Paket, Fake, Fantomas, Femto, Snowflaqe)์ ๋ง์ฐฌ๊ฐ์ง๋ก Fable 3๋ฅผ dotnet ๋๊ตฌ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Fable-compiler๋ฅผ ๋ณ๋ ฌ ๋ฐฐํฌ๋ก ์ ์งํ๋ ๊ฒ์ ๋ช ํํ ์ปท์ ๊ฐ๋ ๊ฒ๋ณด๋ค ์ฌ์ฉ์์๊ฒ ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ ๋๋ค.
์ฌ๋๋ค์ด Fable์ dotnet ๋๊ตฌ๋ก ํธ์ถํ๋ ๋ฐ ์ต์ํด์ง๋ฉด ๋ ์ข๊ฒ ์ง๋ง ๐ธ ํ์ง๋ง... ๋ชจ๋ ์์ต์, ํ๋ก์ ํธ, ํ ํ๋ฆฟ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ๊ณ ํต์ค๋ฝ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค(๊ณผ๊ฑฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก). ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ Fable dotnet ๋๊ตฌ๋ฅผ ํธ์ถํ๋ ์๋ก์ด fable-loader ์ฃผ ๋ฒ์ ์ ์ถ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์ ๊ทธ๋ ์ด๋ ๋จ๊ณ(์์ ๋ ๋ฒ์ ์ด ๋ฆด๋ฆฌ์ค๋ ๊ฒฝ์ฐ)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
dotnet tool install fable
npm upgrade fable-loader
์๋ง๋ *.fs.js
๋ฅผ .gitignore์ ์ถ๊ฐํ ๊ฒ์
๋๋ค. fable-compiler
๋ ์ ๊ฑฐํ ์ ์๋์ง ์ฌ๋ถ, ํธ์ถ๋์ง ์์ ๋ฟ์
๋๋ค. ์ด๋ป๊ฒ ๋ณด์ผ๊น์? ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ๊ฐ ์๋ก์ด ํ์ด๋ธ ๋ก๋๋ฅผ ์ ์งํ๊ธฐ ์ํด ์์ํ ๊ฒ์ธ๊ฐ? ๐
Fable-compiler๋ฅผ ๋ณ๋ ฌ ๋ฐฐํฌ๋ก ์ ์งํ๋ ๊ฒ์ ๋ช ํํ ์ปท์ ๊ฐ๋ ๊ฒ๋ณด๋ค ์ฌ์ฉ์์๊ฒ ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ ๋๋ค.
์ต์ํ์ ๋ณ๊ฒฝ์ผ๋ก ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ๊ฒ์ ์ ๋ง ์ค์ํ๋ฉฐ ๋ง์ ์ฌ๋๋ค์ ๊ธฐ์๊ฒ ํ ๊ฒ์ ๋๋ค. ์ง๊ธ์ ๊ฐ์ ์ฐธ์กฐ(fable์ด ๋จผ์ ํธ์ถ๋ ๋ค์ webpack์ด ํธ์ถ๋จ)์ ์์ค ๋๋ฌธ์ ๋ค์ด๊ทธ๋ ์ด๋์ฒ๋ผ ๋ค๋ฆฌ๋ฉฐ webpack์ Fable์ด ํ์ผ์ ์ปดํ์ผํ ํ์๋ง ํ์ผ์ด ์กด์ฌํ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ์ง๊ธ์ ์์ ํ _invisible_์ด๊ณ ๋งค์ฐ ๋น์ทํ๊ฒ ๋ณด์ ๋๋ค. TypeScript๊ฐ ๊ธฐ์กด ํ๋ก์ ํธ์ ํตํฉ๋๋ ๋ฐฉ๋ฒ.
๋๋ Fable-splitter๋ฅผ ์ฌ์ฉํ๋ ๋์ node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถ ๋ฐ ์คํ์ ๋จ์ํํ๋ CLI ๋๊ตฌ๋ฅผ ์ข์ํฉ๋๋ค.
๋ก์ปฌ ๋๊ตฌ์ ๋ฒ์ ๊ณ ์ ์ ์์ ํ๊ธฐ ๋๋ฌธ์ Fable 3๋ฅผ dotnet ๋๊ตฌ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ธฐ์กด ์ฌ์ฉ์์๊ฒ ์ด๋ค ๊ฒ์ ์ ํธํ๋์ง ๋ฌป๋ ์ค๋ฌธ์กฐ์ฌ(์: Twitter์์)๋ฅผ ๋ง๋๋ ๊ฒ์ด ์์ด๋์ด์ผ ์ ์์ต๋๊น?
์ด ๋ฌธ์ ๋ ์์ค ๋งต์ ๊ดํ ๊ฒ์ด๋ฉฐ ๊ธฐ์ฌ์์๊ฒ ํผ๋์ ์ค ์ ์์ผ๋ฏ๋ก ํ ๋ก ์ #2195๋ก ์ด๋ํฉ๋๋ค.
์์ค ๋งต์ด ์์ผ๋ฉด launch.json
๋ฅผ ํตํด VSCode์์ ๋จ๊ณ๋ณ ๋๋ฒ๊น
๊ณผ ํตํฉํ ์ ์์ต๋๋ค. ๋ง์ต๋๊น?
๋๋ ๋๋ถ๋ถ์ ํ๋ก ํธ ์๋ ์ฌ์ฉ์๊ฐ ์ด์จ๋ ์๊ฐ ์ฌํ ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
VSCode ๋๋ฒ๊ฑฐ๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ค๋จ์ ์ ์์ฑ๋ JS ํ์ผ์์๋ง ์ ์ค๋ ์ ์์ต๋๋ค. ๋๋ VSCode์ Chrome ๋ชจ๋์์ ์์ค ๋งต์ ์์ฃผ ์ฌ์ฉํ์ง๋ง(๋๋ก๋ ์ด๋ฆ ๋งน๊ธ๋ง์ผ๋ก ์ธํด ๊ฐ์ ์๋ณํ๊ธฐ ์ด๋ ค์ ์ง๋ง Nagareyama์์ ๊ฐ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์) ๋ค๋ฅธ ๋ง์ ์ฌ์ฉ์๊ฐ ๊ทธ๋ฌ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ง ์ด์ ๋ํ ์ฝ๋๋ฅผ ์์ํ์ง ์์์ง๋ง ๊ณ์ ์ฃผ์ํ๊ณ ์์ต๋๋ค. ๋ด ์ฒซ ๋ฒ์งธ ์ฑํฅ์ ์ด๊ฒ์ด ์ ํํ ํ์ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ mozilla/source-map ์ ์ง์ ํฌํธ๋ฅผ ์ํํ๋ ๊ฒ์ด์ง๋ง ํฌํธ์ ๋ํด C# ๋๋ F#์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์์ง ๊ถ๊ธํฉ๋๋ค. F#์ผ๋ก ์ง์ ์์ฑํ์ง๋ง C#์ ์ ํํ๋ฉด ๋ช ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก .NET ์์ฝ์์คํ ์ ์ ์ฉํ ์์ค ๋งต ์์ ์ ์ํ ๊ธฐ๋ณธ .NET ๊ตฌํ์ด ์ ๊ณต๋ฉ๋๋ค. ์ง๊ธ์ ์ ํ๋ ์ฌ๊ฐ ์๊ฐ์ ์ด ์ต์ ์ ์ฌ์ฉํ๋ ค๋ ์๋๋ก ํ๋ก์ ํธ ๋ฅผ
๋ฐฉ๊ธ ๋์๊ฒ ์ผ์ด๋ ๋ ๋ค๋ฅธ ์ต์ ์ mozilla/source-map ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ WebAssembly ์ง์์ ์ฌ์ฉํ์ฌ WebAssembly๋ก ์ปดํ์ผํ ๋ค์ Wasmtime์ ์ฌ์ฉํ์ฌ WASM์ .NET ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจํ๋ ๊ฒ ์ ๋๋ค. ๋๋ ์ด ์ต์ ์ ์ต์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด ์๋ํ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ์ํ๋๋ค๋ฉด Javascript์ ์๋ณธ ์์ค ๋งต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ธฐํ๋ ๊ตฌํ์ ์ ์งํ๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ผ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ ๋์๊ฒ ์ผ์ด๋ ๋ ๋ค๋ฅธ ์ต์ ์ mozilla/source-map ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ WebAssembly ์ง์์ ์ฌ์ฉํ์ฌ WebAssembly๋ก ์ปดํ์ผํ ๋ค์ Wasmtime์ ์ฌ์ฉํ์ฌ WASM์ .NET ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจํ๋ ๊ฒ ์ ๋๋ค. ๋๋ ์ด ์ต์ ์ ์ต์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด ์๋ํ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ์ํ๋๋ค๋ฉด Javascript์ ์๋ณธ ์์ค ๋งต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ธฐํ๋ ๊ตฌํ์ ์ ์งํ๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ผ ์ ์์ต๋๋ค.
F# ๋ณํ๊ธฐ์ Java ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค... ๐คท
์ง์งํ๊ฒ ๋งํ์๋ฉด F# ์์ค ๋งต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข์ ์๊ฐ์ผ ๊ฒ์ ๋๋ค.
https://github.com/delneg/source-map-sharp
https://github.com/mozilla/source-map/blob/master/lib/source-map-generator.js ๋ฒ์ญ ์์
์์
๊ฑฐ๊ธฐ์ ์ต๊ณ ์ ์ฝ๋๋ ์๋์ง๋ง ์ง์ ๋ฒ์ญ์ ์๋ํ์ต๋๋ค.
๋ฉ์ง @delneg ์ ๋๋ค . ๊ฐ์ฌํฉ๋๋ค! ๋์ค์ ์๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ฐ์ดํธ๋ฅผ ๋๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ F# ๊ด์ฉ์ด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ง์ ๋ฒ์ญ์ด ๊ฐ์ฅ ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. +1:
๋ช ๊ฐ์ง ์์
์ ์ํํ์ง๋ง(์ฌ๊ธฐ์์๋ https://github.com/delneg/source-map-sharp) util.join
, util.relative
๊ณผ ๊ฐ์ "util.js" ๊ธฐ๋ฅ์ ๋ํ ๋์์ด ํ์ํ ์ ์์ต๋๋ค. source-map-generator.js
์์ ์ฌ์ฉ๋๋
F# ์ ํ ์์ ๋๋ฌธ์ util.getArg
๊ฐ ํ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฑฐ์ ํ์ ํ๊ณ , '__proto__' ๊ด๋ จ ๋ฒ๊ทธ๋ฅผ ํผํ๊ธฐ ์ํ ํดํน์ด๊ธฐ ๋๋ฌธ์ util.toSetString
๊ฐ ํ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฑฐ์ ํ์ ํฉ๋๋ค.
CLI๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง ์๋๋ฉด ... ?
@delneg ๊ฐ์ฌํฉ๋๋ค! ์ฃผ๋ง์ ์ดํด๋ณด๊ณ ํด๋น ๊ธฐ๋ฅ์ ํ๋ณดํ๋ ค๊ณ ํฉ๋๋ค.+1: ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Fable.Cli์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ ๋ฆฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฒ์ํ๋ฉด Nuget ํจํค์ง๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
SourceMapNode, SourceMapGenerator์ ๋๋ถ๋ถ์ ์ํํ์ผ๋ฉฐ ํ์ฌ ์งํ ์ํฉ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด README.md๋ฅผ ๋ง๋ค์์ต๋๋ค.
๋ํ ATM์์ ์ด๋ค ๋์์ด ํ์ํ์ง ์ฐพ์ ์ ์์ต๋๋ค.
https://github.com/mozilla/source-map#generating -a-source-map ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์์ค ๋งต์ ์์ฑํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค... ATM)
์ด๊ฒ์ ํ์์ ์ธ @delneg์ ๋๋ค! ๋น ๋ฅธ ์๋๋ฅผ ํ๊ณ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. +1: ์ด์ ๋๋ฒ๊น ์ ํ์ฑํํ๋ ค๊ณ ํฉ๋๋ค.
์ข์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ฅผ ์ ์ํ ์ ์์ต๋๊น?
์ฆ, ๋๊ฒ ๊ฒ์ ๋๋ ํ
์คํธ ์์ฑ ๋๋ ๋ค๋ฅธ ๊ฒ(๋ฆฌํฌ์งํ ๋ฆฌ์ README์์ ๊ฐ์ ธ์จ ๊ฒ์ผ ์ ์์)
(์ถ์ ๋น๋ก ๋๋ ๋๊ฒ ํผ๋ธ๋ฆฌ์ฑ์ ํด๋ณธ ์ ์ด ์๊ณ ์๋ง๋ ์ฐํ ๊ณ์ ์ ์ฌ์ฉํด์ ํด์ผ ํ ๊ฒ์
๋๋ค)
PPS๊ฐ ๋ฐ๋ก ์๋ํ๋ ๊ฒ์ ๋น์ฐํฉ๋๋ค. F#์ ์ฌ์ฉํ๋ ๋์ ์ต์ํด์ก์ต๋๋ค.
๋ค์ ๋จ๊ณ๋ ์์ค๋งต์ด ์ค์ ๋ก ๋๋ฒ๊น
์ ์ํด ์๋ํ๋์ง ํ
์คํธํ๊ณ Fable์์ ์ถ๊ฐ ์์
์ ์ํํด์ผ ํฉ๋๋ค( --sourceMap
์ต์
์ถ๊ฐ, ํ์ผ์ ์ ์ฅ`. ์ ๊ฐ ์ง์ ํ ์ ์์ต๋๋ค. ๋ํ PR๋ ๋ณด๋ผ ๊ฒ์
๋๋ค) (๋ช
์์ ์ต์
๋์ ์ ํ์ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ด) ์ฝ๊ฐ์ API๋ฅผ ์ฐ๋งํฉ๋๋ค.
์ง๊ธ ์ฐ๋ฆฌ๋ Fable Nuget ๊ณ์ ์ด ์์ผ๋ฉฐ ๋ง์ผ์ ๋๋นํ์ฌ ๊ฐ์ธ ๊ณ์ ๊ณผ ๋ณดํต 2-3๋ช ์ ์์ ์๋ก ํจํค์ง๋ฅผ ๊ฒ์ํ๊ณ ์์ต๋๋ค. nuget.org์์ ๊ณ์ ์ ๋ง๋ค๊ณ ํ ํฐ์ ์์ฑํ๋ฉด ๊ฒ์๋ฅผ ์ฝ๊ฒ ์๋ํํ ์ ์์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ํ๋ณดํ ์ ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ํจํค์ง์ ๊ณต๋ ์์ ์๋ก ๋๋ฅผ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
์ข์, ์๊ฐ์ด ๋๋ฉด ๋๊ฒ ํผ๋ธ๋ฆฌ์ฑ์ ํ์ธํด๋ณผ๊ฒ
๋ํ ์ ์ฅ์์ ๊ณต๋ ์์
์๋ก ์ถ๊ฐํ์ต๋๋ค.
๊ฐ๋ฅํ๋ค๋ฉด API๋ ์กฐ๊ธ ๋ค๋ฌ๊ณ SourceGenerator์ ๋ํ ๋ช ๊ฐ์ง ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
SourceMapGenerator์ ๋ํ ๋ ๋ง์ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์์ํ๋๋ฐ ์จ์ด ์๋ ๋ช ๊ฐ์ง ๋ฒ๊ทธ๊ฐ ๋๋ฌ๋ฌ์ต๋๋ค.
์ผ๋ถ๋ ์ด์ ์์ ๋์์ง๋ง ๋ชจ๋ ์์ ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ์ ์ - ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋งคํ์ด ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
๊ทธ๋์ nuget atm์ ๊ณต๊ฐํ๊ธฐ์๋ ์กฐ๊ธ ์ด๋ฅด๋ค.
๋๊ตฐ๊ฐ ๋์์ ์ฃผ๊ณ ์ถ๋ค๋ฉด - ์คํจํ ํ
์คํธ๋ฅผ ์ดํด๋ณด์ธ์( dotnet test
)
https://www.nuget.org/packages/source-map-sharp/
Nuget ํจํค์ง๋ฅผ ๊ฒ์ํ์ผ๋ฉฐ SourceMapGenerator ๊ด๋ จ ์ค์ ๋งคํ ์์ฑ(SerializeMapping ๊ธฐ๋ฅ)์ ๋ํ ํ
์คํธ๊ฐ ์๋ฃ๋๊ณ ๋ฒ๊ทธ๊ฐ ์์ ๋์์ผ๋ฏ๋ก ์ ๋๋ก ์๋ํด์ผ ํฉ๋๋ค.
๋๋ SourceNode ๋ฐ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ํด ๊ณ์ํ ๊ฒ์ด๊ณ , some1์ด util.relative
/ util.join
๋์์ ์ค ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ฉ์ง๋ค์ @delneg! ๊ฐ์ฌํฉ๋๋ค! ํด์ผ์ด ์ง๋๋ฉด ์ฒ์ฒํ ์ ๋ฌด๋ก ๋์๊ฐ๊ณ ์์ผ๋ฏ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์์ค ๋งต์ ์ง์ํ๋ Fable 3.1 ๋ฒ ํ ๋ฆด๋ฆฌ์ค๋ฅผ ํธ์ํ๋ ค๊ณ ํฉ๋๋ค.+1:
Fable ์์ฒด์๋ SourceNode๊ฐ ํ์ํ์ง ์๋ค๊ณ ์๊ฐํ์ง๋ง ์์ ์ฑ์ ์ํด ์ถ๊ฐํ๋ ๊ฒ์ ์ ํธํ๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ์๋น์์๊ฒ ๋์์ด ๋ ์ ์์ต๋๋ค. util.relative/join
์ ๋ํด ํ๋ก์ ํธ์ PR์ ๋ณด๋ด๋ ค๊ณ ์๋ํ์ง๋ง ์ด๊ฒ์ด .NET์์ ์คํ๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ System.IO.Path.GetRelativePath
๋ฐ System.IO.Path.Combine
๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. : https://docs.microsoft.com/en-us/dotnet/api/system.io.path?view=net-5.0
์ํ๊น๊ฒ๋ GetRelativePath
๋ netstandard2.0์์ ์ฌ์ฉํ ์ ์์ต๋๋ค(https://docs.microsoft.com/en-us/dotnet/api/system.io.path.getrelativepath?view=net-5.0#applies ์ฐธ์กฐ). -์๊ฒ)
ํด๊ฒฐ์ฑ
์ netstandard2.1๋ก ์ถฉ๋ํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค(์ข์ ๊ฒ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค)
util.join
์ ๊ดํ์ฌ - ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณธ ํ consumer
๊ด๋ จ ์ฌ๋ก(๋๋ atm์ ํ์ง ์์ ๊ฒ์)์์๋ง ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ค์ ๋ก ์ง๊ธ ๋น์ฅ์ ํ์ํ์ง ์์ต๋๋ค.
์ถ์ SourceNode ๋ฑ์ ๊ดํด์ - ์ ์๊ฐ์๋ ์ฐ๋ฆฌ๊ฐ sourcemap์ .net ํฌํธ๋ฅผ ํ๊ณ ์๋ค๋ฉด ์๋ ๋ชจ๋ ๊ฒ์ ์ ๋๋ก ๊ตฌํํ๋๋ก ํฉ์๋ค. ์ง๊ธ์ ์ฌ์ฉํ์ง ์๋๋ผ๋ 1~2๋ ํ์ ํ์ํ ์๋ ์์ต๋๋ค.
.Net Standard 2.1์ Mono์ ๊ด๋ จ๋ ๊ฒ๋ค์ ๋จผ์ง ์์ ๋จ๊ฒจ๋ ๊ฒ์ ๋๋ค(์ฆ, Xamarin ๊ฒ๋ค). ๊ทธ๋ฌ๋ Fable ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ๊ฐ๋ฐ ์ ์ฉ ์ข ์์ฑ์ด๊ณ ํ๋ ์์ํฌ๊ฐ ๋ฐํ์์ ์ค์ ๋ก ์๋ฌด ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Fable์์๋ง ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ 2.1์ด ์ ํฉํ์ง๋ง ๋ค๋ฅธ .Net ํญ๋ชฉ๊ณผ์ ์ต๋ ํธํ์ฑ์ ์ํ๋ค๋ฉด 2.0์ด ๋ ์ด์์ ์ ๋๋ค.
FWIW, ๋๊ตฐ๊ฐ StackOverflow์์ ๊ฐ๋จํ ๊ตฌํ์ ์ ๊ณตํ์ต๋๋ค. https://stackoverflow.com/questions/275689/how-to-get-relative-path-from-absolute-path
.Net Standard 2.1์ Mono์ ๊ด๋ จ๋ ๊ฒ๋ค์ ๋จผ์ง ์์ ๋จ๊ฒจ๋ ๊ฒ์ ๋๋ค(์ฆ, Xamarin ๊ฒ๋ค). ๊ทธ๋ฌ๋ Fable ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ๊ฐ๋ฐ ์ ์ฉ ์ข ์์ฑ์ด๊ณ ํ๋ ์์ํฌ๊ฐ ๋ฐํ์์ ์ค์ ๋ก ์๋ฌด ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ง๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Fable์์๋ง ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ 2.1์ด ์ ํฉํ์ง๋ง ๋ค๋ฅธ .Net ํญ๋ชฉ๊ณผ์ ์ต๋ ํธํ์ฑ์ ์ํ๋ค๋ฉด 2.0์ด ๋ ์ด์์ ์ ๋๋ค.
FWIW, ๋๊ตฐ๊ฐ StackOverflow์์ ๊ฐ๋จํ ๊ตฌํ์ ์ ๊ณตํ์ต๋๋ค. stackoverflow.com/questions/275689/how-to-get-relative-path-from-absolute-path
์ง๊ธ์ 2.1๋ก ๋ณ๊ฒฝํ๊ณ ์ ์ฌ์ ์ธ netstandard2.0 ์ฌ์ฉ์๋ฅผ ์ํด README์ ๋ฉ๋ชจ๋ฅผ ๋จ๊ธธ ๊ฒ์
๋๋ค.
2.0์์ ์๋ํ๋ ๋ฐ ํ์ํ ์ฌ๋์ด ์์ผ๋ฉด Stackoverflow์ ๋์ฒด ์๋ฃจ์
์ด ์ ๊ณต๋ฉ๋๋ค.
ํธ์ง: ์ ๋ก๋๋ 1.0.1 https://www.nuget.org/packages/source-map-sharp/1.0.1 with netstandard2.1
๋ ๋ค๋ฅธ ์ต์ ์ ๋ค์ค ๋์ ์ง์ ์ ํตํด GetRelativePath์ ์์กดํ๋ ํญ๋ชฉ์ ์กฐ๊ฑด๋ถ๋ก ์ ์ธ(#if ์ฌ์ฉ)ํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ .Net ํ์ค 2.0์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋ ๋ค๋ฅธ ์ต์ ์ ๋ค์ค ๋์ ์ง์ ์ ํตํด GetRelativePath์ ์์กดํ๋ ํญ๋ชฉ์ ์กฐ๊ฑด๋ถ๋ก ์ ์ธ(#if ์ฌ์ฉ)ํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ .Net ํ์ค 2.0์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๊ฐ๋จํ ์๋ URL์ ๋ฌธ์ ์ ๋ํ ๊ณผ๋ํ ๋ณต์ก์ฑ์ฒ๋ผ ๋ณด์ ๋๋ค( GetRelativePath๊ฐ ํ์ํ atm๋ง ํด๋น).
dotnet ๋๊ตฌ๋ก์์ Fable์ netcoreapp3.1์ด๋ฏ๋ก netstandard2.1์ ๋์์ผ๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Path.GetRelativePath(path, pathTo).Replace('\\', '/')
์ ๊ฐ์ด Windows์์ ์คํํ ๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ทํํด์ผ ํ ์๋ ์์ต๋๋ค.
@jwosty๊ฐ ์ง์ ํ ๋๋ก ์ต๋ ํธํ์ฑ์ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ netstandard2.0์ ๋์์ผ๋ก ํ๋๋ก ํ๋ ค๋ฉด ์ค์ ๋ก ์์ฒด ๊ตฌํ์ด ์์ต๋๋ค. ๋๋ ํ ๋์ ๊ทธ๊ฒ์ ์๋ ์ํ์ง๋ง ์ ์๋ ๊ฒ ๊ฐ๋ค : https://github.com/fable-compiler/Fable/blob/ba509a94a50522794d3e60f27dd826bb5602eca1/src/Fable.Transforms/Global/Prelude.fs#L508 -L555
๋ํ Path.GetRelativePath
๋ ์๋ ๊ฒฝ๋ก ์์ ํญ์ ๋ง์นจํ๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
> Path.GetRelativePath("/foo/bar", "/foo/bar/hoho/mir");;
val it : string = "hoho\mir"
๋ง์นจํ๋ ์์ค๋งต URL์ ํ์ํ ์ ์์ผ๋ฏ๋ก ๊ฒฝ๋ก๋ฅผ ์ ๊ทํํ ๋ ์์ ๋ฐ์ท ๋ถ๋ถ์ 545-548 ํ๊ณผ ๊ฐ์ ์์ ์ ์ํํด์ผ ํ ์๋ ์์ต๋๋ค.
์์ ๋ด์ฉ์ ํ์ธํ๊ณ JS(test-util.js์ ๊ฝค ๋ง์ ๋ถ๋ถ์ด ์์)์ ํ
์คํธ๋ฅผ ์กฐ์ ํ๊ณ ์๋ง๋ ์์ฒด ๊ตฌํ์ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
๋ํ ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ๋จ์ ์์ต๋๋ค.
1) ํ ๋ก ์ source-map-sharp ์ ์ฅ์ ๋ฌธ์ ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํด์ผ ํ ๊น์?
2) ์ฐ๋ฆฌ๋ ์ด ํ๋ก์ ํธ๋ฅผ ์ํด ์ผ์ข
์ WASM ์ปดํ์ผ์ ์ฌ์ฉํ ๊ณํ์
๋๊น?
3) Fable์ด source-map-sharp๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๋ ๋ฐ ํ์ํ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๊น(๋ฌธ์, ํ
์คํธ, ์ถ๊ฐ API ๋ฑ ํฌํจ).
ํธ์ง: ์ข์ต๋๋ค. ์ด๋ฏธ ์ฌ์ฉ์ ์ ์ Util.getRelativePath๋ฅผ ์ถ๊ฐํ๊ณ ํ
์คํธ๋ฅผ ์ถ๊ฐํ์ผ๋ฉฐ ์ฝ๊ฐ์ ์์ ํ์๋ ๋
น์์ด ๋์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ netstandard2.0์ผ๋ก ๋์๊ฐ๊ฑฐ๋ 1.0.2 ๋๊ฒ์ ๊ฒ์ํด์ผ ํฉ๋๊น?
๋๋จํ๋ค @delneg! ๐ ๐ ๐
@delneg์ ํ์์ ์ธ ์์ ๋๋ถ์ Fable 3.1 ๋ฒ ํ๊ฐ ์์ค ๋งต ์ง์๊ณผ ํจ๊ป ๊ฒ์๋์์ต๋๋ค! :ํ๋ค: https://twitter.com/FableCompiler/status/1347421291502997504
ํ์์ - Fable ์ฌ์ฉ์๋ก๋ถํฐ: @delneg ์ ๋ํด ๋ง์ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค!
๋๋ผ์ด ๋๋ผ์ด ๋๋ผ์ด!
๋๋จํ๋ค @delneg! ๐ ๐ ๐
1. Yes it makes sense to move discussion to source-map-sharp repository ๐ Please mention me when you need my input so I get the notification. 2. Didn't check WASM usage in original source-map, but I assume they use it in environments supporting WASM to speed up numeric calculations. I don't think we need to worry about it in the .NET port. 3. It should be fine, I just didn't have much time these days, but I'll try to publish a 3.1 beta release soon with source maps ๐ช You can go ahead and publish 1.0.2 so we use this in the beta.
์ง์ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์์ผ๋ก source-map-sharp๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์ด๋ฉฐ ์ง๊ธ ์๋ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
1) ๊ทธ๋ฌ๋ฉด repo์ ์ด์์ ๊ธ์ ์ฐ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ ์ง๋ฌธ์ด ์๋ ๊ฒฝ์ฐ ๋ฑ - source-map-sharp์์ ์ด์๋ฅผ ์ด์ด์ฃผ์ธ์.
2) ์, ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด WASM์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
WASM ๋ฒ์ ์ source-map-sharp ์๋์ ์๋ํ์ง๋ง .net์ WASM ์ปดํ์ผ ์ํ๊ฐ ๋์ฐํ๊ณ ์ฌ์ฉํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค(์ผ๋ถ ์์
์ Uno.Platform.Bootstrap ํ๋ก์ ํธ์์ ์ํ๋์ง๋ง ์ดํด๋ณด๋ ์์ค ์ฝ๋๋ ๋๋ฅผ ๋งค์ฐ ์ค๋ง ์์ผฐ์ต๋๋ค)
source-map-sharp๊ฐ .NET ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์ ์ง๋๋ ํ ๋ ๋ง์ ์ฑ๋ฅ์ด ํ์ํ๋ฉด ํญ์ Span์ ๋ณผ ์ ์์ต๋๋ค.
3) ๋๋ 1.0.2๋ฅผ ๊ฒ์ํ๊ณ ๋น์ ์ด ์ด๋ฏธ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์์ผ๋ฏ๋ก ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค.
๋ฒ๊ทธ ๋ฑ์ด ๋ฐ๊ฒฌ๋๋ฉด ์์ผ๋ก Nuget์ ๊ณ์ ๊ฒ์ํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค. (๊ทธ๋ฆฌ๊ณ API๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ ค๊ณ ๋
ธ๋ ฅํฉ๋๋ค)
@alfonsogarciacaro ์ ์ง์นจ์ ์ ์ฉํ ํ์๋ ์ฌ์ ํ ์์ค ๋งต์ด ํ์๋์ง ์๋ ์ฌ๋์ ์ํด ์ถ๋ ฅ ํ์ผ(๋ชจ๋ .fs.js
ํฌํจ)์ ์ ๋ฆฌํ๊ณ ๋น๋๋ฅผ ๋ค์ ์คํํ์ญ์์ค. ์ฒญ์ํ์ง ์๊ณ ๋จ์ํ ์ฌ๊ฑดํ๋ ๊ฒ์ด ํจ๊ณผ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์์๋ด๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
๊ทธ ์ธ์๋ ์ด ํ๋ฅญํ ๊ธฐ๋ฅ์ ๋ค์ ๊ฐ์ ธ์์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค ๐
๋ฉ์ง ์ผ! ๋๋ ์ด ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ค๋ ๋ค์ ์์ผ๋ฉฐ ๊ธฐ์๊ฒ๋ ์ด๋ฏธ ์๋ฃ๋์์ต๋๋ค. ๋๋ ์ด ๋ ธ๋ ฅ์ ์ํด ์ค์บํด๋ฉ ์ ํ๊ณ ์ง๊ธ์ https://github.com/delneg/source-map-sharp ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌ์ผฐ์ต๋๋ค. ๋ ์ํ์ด!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
https://github.com/delneg/source-map-sharp
https://github.com/mozilla/source-map/blob/master/lib/source-map-generator.js ๋ฒ์ญ ์์ ์์
๊ฑฐ๊ธฐ์ ์ต๊ณ ์ ์ฝ๋๋ ์๋์ง๋ง ์ง์ ๋ฒ์ญ์ ์๋ํ์ต๋๋ค.