Fable: ์†Œ์Šค ๋งต ์ง€์› ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ

์— ๋งŒ๋“  2020๋…„ 09์›” 15์ผ  ยท  35์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fable-compiler/Fable

Fable 3๋Š” ์ดˆ๊ธฐ์— F# ์†Œ์Šค ๋งต ์ง€์› ์—†์ด ์ถœ์‹œ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ง€๋งŒ(๋” ์ฝ๊ธฐ ์‰ฌ์šด JS ์ถœ๋ ฅ์œผ๋กœ ์ด๋ฅผ ๋ณด์™„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Œ) ์ด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ”„๋ผ ๋Š” ์—ฌ์ „ํžˆ ์ œ์ž๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. Fable 3๋Š” "์ˆœ์ˆ˜ํ•œ" dotnet ์•ฑ์ด๋ฏ€๋กœ ์†Œ์Šค ๋งต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด dotnet ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์•„๋งˆ๋„ Mozilla JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์†Œ์Šค๋งต ์ƒ์„ฑ๊ธฐ๋ฅผ dotnet (F# ๋˜๋Š” C#)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

help wanted

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

https://github.com/delneg/source-map-sharp
https://github.com/mozilla/source-map/blob/master/lib/source-map-generator.js ๋ฒˆ์—ญ ์ž‘์—… ์‹œ์ž‘
๊ฑฐ๊ธฐ์— ์ตœ๊ณ ์˜ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ง์ ‘ ๋ฒˆ์—ญ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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! ๐Ÿ‘ ๐Ÿš€ ๐Ÿ‘

  1. ์˜ˆ, ํ† ๋ก ์„ source-map-sharp ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. +1: ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ œ ์ž…๋ ฅ์ด ํ•„์š”ํ•  ๋•Œ ์ €๋ฅผ ์–ธ๊ธ‰ํ•ด ์ฃผ์„ธ์š”.
  2. ์›๋ณธ ์†Œ์Šค ๋งต์—์„œ WASM ์‚ฌ์šฉ์„ ํ™•์ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ˆซ์ž ๊ณ„์‚ฐ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด WASM์„ ์ง€์›ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. .NET ํฌํŠธ์—์„œ๋Š” ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ดœ์ฐฎ์„ ๊ฑฐ์—์š”. ์š”์ฆ˜ ์‹œ๊ฐ„์ด ๋ณ„๋กœ ์—†์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ณง ์†Œ์Šค ๋งต๊ณผ ํ•จ๊ป˜ 3.1 ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ’ช 1.0.2๋ฅผ ๊ฒŒ์‹œํ•˜์—ฌ ๋ฒ ํƒ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@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์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋ฐ ๊ธฐํƒ€ .NET ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3) ๋‚˜๋Š” 1.0.2๋ฅผ ๊ฒŒ์‹œํ–ˆ๊ณ  ๋‹น์‹ ์ด ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์œผ๋ฏ€๋กœ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.
๋ฒ„๊ทธ ๋“ฑ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ์•ž์œผ๋กœ Nuget์„ ๊ณ„์† ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค)

@alfonsogarciacaro ์˜ ์ง€์นจ์„ ์ ์šฉํ•œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์†Œ์Šค ๋งต์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ถœ๋ ฅ ํŒŒ์ผ(๋ชจ๋“  .fs.js ํฌํ•จ)์„ ์ •๋ฆฌํ•˜๊ณ  ๋นŒ๋“œ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ฒญ์†Œํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์žฌ๊ฑดํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ์—๋„ ์ด ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ‘

๋ฉ‹์ง„ ์ผ! ๋‚˜๋Š” ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋Š˜ ๋‹ค์‹œ ์™”์œผ๋ฉฐ ๊ธฐ์˜๊ฒŒ๋„ ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๋…ธ๋ ฅ์„ ์œ„ํ•ด ์Šค์บํด๋”ฉ ์„ ํ–ˆ๊ณ  ์ง€๊ธˆ์€ https://github.com/delneg/source-map-sharp ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌ์ผฐ์Šต๋‹ˆ๋‹ค. ๋˜ ์ž˜ํ–ˆ์–ด!

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