๐Ÿ› ๏ธ .NET Core Global Tools ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ: ๊ฐœ๋ฐœ์ž์˜ ํ•„์ˆ˜ ๋„๊ตฌ ํ‚คํŠธ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ› ๏ธ .NET Core Global Tools ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ: ๊ฐœ๋ฐœ์ž์˜ ํ•„์ˆ˜ ๋„๊ตฌ ํ‚คํŠธ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ด์ • ๋„˜์น˜๋Š” ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ .NET Core Global Tools์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์ƒํ™œ์„ ์–ด๋–ป๊ฒŒ ํ˜์‹ ์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์ด๋ผ๋Š” ๋ฉ‹์ง„ ํ”Œ๋žซํผ์„ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ์ด๊ณณ์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ ์ง€์‹๊ณผ ๊ธฐ์ˆ ์„ ๊ณต์œ ํ•˜๋Š” ๊ณณ์ธ๋ฐ์š”. ์˜ค๋Š˜ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šธ .NET Core Global Tools ๊ฐœ๋ฐœ ๊ธฐ์ˆ ๋„ ์ด๋Ÿฐ ํ”Œ๋žซํผ์—์„œ ๊ณต์œ ํ•˜๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์„ ํŽผ์น  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Š

๐Ÿ’ก ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”? .NET Core Global Tools๋Š” ๋ช…๋ น ์ค„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ NuGet ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ํž˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ !

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ .NET Core Global Tools์˜ ์„ธ๊ณ„๋กœ ๋›ฐ์–ด๋“ค์–ด๋ณผ๊นŒ์š”? ์šฐ๋ฆฌ์˜ ์—ฌ์ •์€ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ๊นŒ์ง€ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด์—์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์ถœ๋ฐœ~! ๐Ÿš€

๐Ÿ“š .NET Core Global Tools: ๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

.NET Core Global Tools๋Š” .NET Core SDK์˜ ์ผ๋ถ€๋กœ, ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ช…๋ น ์ค„์—์„œ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ NuGet ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋”์šฑ ํ’๋ถ€ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค„ ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜ƒ

๐Ÿ” Global Tools์˜ ํŠน์ง•

  • ๊ฐ„ํŽธํ•œ ์„ค์น˜: dotnet CLI๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์ „์—ญ ์ ‘๊ทผ์„ฑ: ์„ค์น˜ ํ›„ ์‹œ์Šคํ…œ ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์š”.
  • ๋ฒ„์ „ ๊ด€๋ฆฌ: ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ: Windows, macOS, Linux์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์š”.

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•๋ถ„์— Global Tools๋Š” ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์ธ๊ธฐ๊ฐ€ ๋‚ ๋กœ ๋†’์•„์ง€๊ณ  ์žˆ์–ด์š”. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ์ด๋Ÿฐ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์„ ์ข…์ข… ๋ณผ ์ˆ˜ ์žˆ์ฃ . ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ณง ๊ทธ ์ฃผ์ธ๊ณต์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

๐ŸŒŸ ํŒ: Global Tools๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์ฃ !

๐Ÿ› ๏ธ Global Tools vs Local Tools

Global Tools์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐœ๋…์œผ๋กœ Local Tools๊ฐ€ ์žˆ์–ด์š”. ์ด ๋‘˜์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณผ๊นŒ์š”?

ํŠน์„ฑ Global Tools Local Tools
์„ค์น˜ ๋ฒ”์œ„ ์‹œ์Šคํ…œ ์ „์ฒด ํŠน์ • ํ”„๋กœ์ ํŠธ
์ ‘๊ทผ์„ฑ ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
๋ฒ„์ „ ๊ด€๋ฆฌ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌ ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์ž๋™ ๊ด€๋ฆฌ

๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์–ด์š”. Global Tools๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋ฒ„์ „ ์ถฉ๋Œ์˜ ์œ„ํ—˜์ด ์žˆ๊ณ , Local Tools๋Š” ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ค์ •์ด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์ฃ . ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”. ๐Ÿ˜Š

๐ŸŒˆ Global Tools์˜ ํ™œ์šฉ ์‚ฌ๋ก€

Global Tools๋Š” ์ •๋ง ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฉด์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”?

  • ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ: ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„๊ตฌ: DB ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌ
  • ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ถ„์„
  • API ๋ฌธ์„œ ์ƒ์„ฑ๊ธฐ: API ๋ช…์„ธ๋ฅผ ์ž๋™์œผ๋กœ ๋ฌธ์„œํ™”
  • ์ฝ”๋“œ ํฌ๋งทํ„ฐ: ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์œ ์ง€

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ• ์ง€ ์ƒ์ƒ์ด ๋˜์‹œ๋‚˜์š”? ๊ฒŒ๋‹ค๊ฐ€ ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๋„๊ตฌ๋ฅผ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๊ณต์œ ํ•˜๋ฉด, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋„ ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Ž

๐Ÿ’ก ์•„์ด๋””์–ด: ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋…ํŠนํ•œ Global Tool์„ ๊ฐœ๋ฐœํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •์„ ์ž๋™ํ™”ํ•˜๋Š” ๋„๊ตฌ๋‚˜, ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋•๋Š” ๋„๊ตฌ ๋“ฑ์„ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ๊ฒฝํ—˜์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋น›๋‚˜๊ฒŒ ๋งŒ๋“ค์–ด์ค„ ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ .NET Core Global Tools์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์…จ๋‚˜์š”? ๐Ÿ˜Š ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ Global Tool์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

๐Ÿ› ๏ธ .NET Core Global Tool ๊ฐœ๋ฐœํ•˜๊ธฐ: ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ .NET Core Global Tool์„ ๊ฐœ๋ฐœํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ ๋ฒˆ์งธ Global Tool์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

๋จผ์ €, ์ƒˆ๋กœ์šด ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ด์š”. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”:

dotnet new console -n MyFirstGlobalTool

์ด ๋ช…๋ น์€ 'MyFirstGlobalTool'์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ ์ฝ˜์†” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์ด๋ฆ„์ด์ฃ ? ๐Ÿ˜Ž

2๏ธโƒฃ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ

์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™ํ•œ ํ›„, .csproj ํŒŒ์ผ์„ ์—ด์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <PackAsTool>true</PackAsTool>
    <ToolCommandName>myfirsttool</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>
  </PropertyGroup>

</Project>

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

๐ŸŒŸ ํŒ: ToolCommandName์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๊ธฐ์–ตํ•˜๊ณ  ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ด๋ฆ„์œผ๋กœ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, 'generate-code'๋‚˜ 'db-migrate' ๊ฐ™์€ ์ด๋ฆ„์ด ์ข‹๊ฒ ์ฃ ?

3๏ธโƒฃ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

์ด์ œ ์‹ค์ œ๋กœ ๋„๊ตฌ๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ฝ”๋”ฉํ•  ์ฐจ๋ก€์˜ˆ์š”. Program.cs ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด๋ณผ๊นŒ์š”?

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("์•ˆ๋…•ํ•˜์„ธ์š”! ์ œ ์ฒซ ๋ฒˆ์งธ .NET Core Global Tool์ž…๋‹ˆ๋‹ค!");
        Console.WriteLine("์˜ค๋Š˜ ๋‚ ์งœ: " + DateTime.Now.ToShortDateString());
    }
}

์ด ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋Š” ์ธ์‚ฌ๋ง๊ณผ ํ•จ๊ป˜ ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฑด ์‹œ์ž‘์ผ ๋ฟ์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ์ƒ๋ ฅ์„ ๋ฐœํœ˜ํ•ด ๋” ๋ณต์žกํ•˜๊ณ  ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐ŸŒˆ

4๏ธโƒฃ ๋„๊ตฌ ๋นŒ๋“œํ•˜๊ธฐ

์ฝ”๋“œ ์ž‘์„ฑ์ด ๋๋‚ฌ๋‹ค๋ฉด, ์ด์ œ ๋„๊ตฌ๋ฅผ ๋นŒ๋“œํ•  ์ฐจ๋ก€์˜ˆ์š”. ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”:

dotnet pack

์ด ๋ช…๋ น์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  NuGet ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ํŒจํ‚ค์ง€๋Š” ์ด์ „์— ์ง€์ •ํ•œ ./nupkg ํด๋”์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์š”.

5๏ธโƒฃ ๋„๊ตฌ ์„ค์น˜ํ•˜๊ธฐ

๋นŒ๋“œ๋œ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ด๋ณผ๊นŒ์š”? ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

dotnet tool install --global --add-source ./nupkg MyFirstGlobalTool

์ด ๋ช…๋ น์€ ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋„๊ตฌ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์‹œ์Šคํ…œ ์–ด๋””์„œ๋‚˜ ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!

6๏ธโƒฃ ๋„๊ตฌ ์‹คํ–‰ํ•˜๊ธฐ

๋“œ๋””์–ด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ ์‹œ๊ฐ„์ด์—์š”! ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด๋ณด์„ธ์š”:

myfirsttool

์งœ์ž”! ๐ŸŽ‰ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์˜ค๋Š˜ ๋‚ ์งœ๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‚˜์š”? ์ถ•ํ•˜๋“œ๋ ค์š”, ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉ๊ธˆ ์ž์‹ ๋งŒ์˜ .NET Core Global Tool์„ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ–ˆ์–ด์š”!

๐Ÿ’ก ์ƒ๊ฐํ•ด๋ณด๊ธฐ: ์ด ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ ์งœ ํ˜•์‹์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ๋‹ค์–‘ํ•œ ์‹œ๊ฐ„๋Œ€์˜ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜๋ ฅ์„ ๋งˆ์Œ๊ป ๋ฐœํœ˜ํ•ด๋ณด์„ธ์š”!

์ž, ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์™„์ „ํ•œ .NET Core Global Tool์„ ๋งŒ๋“ค์–ด๋ดค์–ด์š”. ์–ด๋– ์…จ๋‚˜์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ๐Ÿ˜Š

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ๊ธฐ๋ณธ์ ์ธ ํ‹€์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ณต์žกํ•˜๊ณ  ์œ ์šฉํ•œ ๋„๊ตฌ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ ๋ณ€ํ™˜๊ธฐ, ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„๊ตฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ . ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ์ƒ๋ ฅ์ด ๊ณง ํ•œ๊ณ„์˜ˆ์š”!

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ข€ ๋” ์‹ค์šฉ์ ์ด๊ณ  ๋ณต์žกํ•œ Global Tool์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๊ณ„์†ํ•ด์„œ ํ•จ๊ป˜ ๋ฐฐ์›Œ๋‚˜๊ฐ€์š”! ๐Ÿš€

๐Ÿš€ ๊ณ ๊ธ‰ .NET Core Global Tool ๊ฐœ๋ฐœ: ์‹ค์šฉ์ ์ธ ์˜ˆ์ œ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์ธ .NET Core Global Tool์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ณ  ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๋” ์‹ค์šฉ์ ์ธ Global Tool์„ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•ด์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๐Ÿ˜ƒ

๐ŸŽจ ํ”„๋กœ์ ํŠธ: ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๊ธฐ

์ด๋ฒˆ์— ๋งŒ๋“ค ๋„๊ตฌ๋Š” C# ์ฝ”๋“œ์˜ ์Šคํƒ€์ผ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”. ์ด ๋„๊ตฌ๋Š” ์ฃผ์–ด์ง„ C# ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๊ณ , ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•  ๊ฑฐ์˜ˆ์š”. ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ

1. ํ”„๋กœ์ ํŠธ ์„ค์ •

๋จผ์ €, ์ƒˆ๋กœ์šด ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

dotnet new console -n CodeStyleChecker

๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ํŒŒ์ผ(CodeStyleChecker.csproj)์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <PackAsTool>true</PackAsTool>
    <ToolCommandName>codestyle</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>
    <Version>1.0.0</Version>
    <Authors>Your Name</Authors>
    <Description>A tool to check C# code style</Description>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" />
  </ItemGroup>

</Project>

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Microsoft.CodeAnalysis.CSharp ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ–ˆ์–ด์š”. ์ด ํŒจํ‚ค์ง€๋Š” C# ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฑฐ์˜ˆ์š”.

2. ์ฝ”๋“œ ์ž‘์„ฑ

์ด์ œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? Program.cs ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”:

using System;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("์‚ฌ์šฉ๋ฒ•: codestyle <ํŒŒ์ผ๊ฒฝ๋กœ>");
            return;
        }

        string filePath = args[0];
        if (!File.Exists(filePath))
        {
            Console.WriteLine($"ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {filePath}");
            return;
        }

        string code = File.ReadAllText(filePath);
        SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
        CompilationUnitSyntax root = tree.GetCompilationUnitRoot();

        int issues = 0;

        foreach (var method in root.DescendantNodes().OfType<MethodDeclarationSyntax>())
        {
            if (method.Identifier.ToString().Length > 20)
            {
                Console.WriteLine($"๊ฒฝ๊ณ : ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค ({method.Identifier})");
                issues++;
            }

            if (method.ParameterList.Parameters.Count > 5)
            {
                Console.WriteLine($"๊ฒฝ๊ณ : ๋ฉ”์„œ๋“œ {method.Identifier}์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค ({method.ParameterList.Parameters.Count})");
                issues++;
            }
        }

        foreach (var property in root.DescendantNodes().OfType<PropertyDeclarationSyntax>())
        {
            if (!property.Identifier.ToString().StartsWith(char.ToUpper(property.Identifier.ToString()[0])))
            {
                Console.WriteLine($"๊ฒฝ๊ณ : ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ({property.Identifier})");
                issues++;
            }
        }

        Console.WriteLine($"๊ฒ€์‚ฌ ์™„๋ฃŒ. ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ: {issues}๊ฐœ");
    }
}

์šฐ์™€, ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๊ธธ์–ด์กŒ๋„ค์š”! ๐Ÿ˜… ํ•˜์ง€๋งŒ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋ฉด ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์•„์š”.

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…:

  • ์ด ๋„๊ตฌ๋Š” ๋ช…๋ น์ค„ ์ธ์ž๋กœ ๋ฐ›์€ ํŒŒ์ผ ๊ฒฝ๋กœ์˜ C# ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด์š”.
  • Microsoft.CodeAnalysis๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์š”.
  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด 20์ž๋ฅผ ์ดˆ๊ณผํ•˜๋Š”์ง€, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 5๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์š”.
  • ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์š”.
  • ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๋ฌธ์ œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด๊ณ ํ•ด์š”.

3. ๋นŒ๋“œ ๋ฐ ์„ค์น˜

์ด์ œ ์šฐ๋ฆฌ์˜ ๋ฉ‹์ง„ ๋„๊ตฌ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ด๋ณผ๊นŒ์š”?

dotnet pack
dotnet tool install --global --add-source ./nupkg CodeStyleChecker

4. ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ์‹œ๊ฐ„์ด์—์š”! ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ C# ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

// TestCode.cs
using System;

class Program
{
    public static void ThisIsAReallyLongMethodNameThatShouldTriggerAWarning(int param1, int param2, int param3, int param4, int param5, int param6)
    {
        Console.WriteLine("Hello, World!");
    }

    public string propertyWithLowercaseName { get; set; }
}

์ด์ œ ์šฐ๋ฆฌ์˜ ๋„๊ตฌ๋กœ ์ด ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•ด๋ด์š”:

codestyle TestCode.cs

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฑฐ์˜ˆ์š”:

๊ฒฝ๊ณ : ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค (ThisIsAReallyLongMethodNameThatShouldTriggerAWarning)
๊ฒฝ๊ณ : ๋ฉ”์„œ๋“œ ThisIsAReallyLongMethodNameThatShouldTriggerAWarning์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค (6)
๊ฒฝ๊ณ : ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (propertyWithLowercaseName)
๊ฒ€์‚ฌ ์™„๋ฃŒ. ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ: 3๊ฐœ

์งœ์ž”! ๐ŸŽ‰ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ๊ฐ€ ์ฝ”๋“œ์˜ ์Šคํƒ€์ผ ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ์ฐพ์•„๋ƒˆ์–ด์š”!

๐Ÿ’ก ๊ฐœ์„  ์•„์ด๋””์–ด: ์ด ๋„๊ตฌ๋ฅผ ๋” ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์ด ๋งŽ์•„์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ๋” ๋งŽ์€ ์ฝ”๋”ฉ ๊ทœ์น™ ์ถ”๊ฐ€ํ•˜๊ธฐ (์˜ˆ: ๋“ค์—ฌ์“ฐ๊ธฐ, ์ฃผ์„ ์Šคํƒ€์ผ ๋“ฑ)
  • ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ๊ทœ์น™์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ
  • ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์ •ํ™•ํ•œ ์ค„ ๋ฒˆํ˜ธ ํ‘œ์‹œํ•˜๊ธฐ
  • ์ž๋™์œผ๋กœ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜๋ ฅ์„ ๋ฐœํœ˜ํ•ด ์ด ๋„๊ตฌ๋ฅผ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ์‹ค์šฉ์ ์ธ .NET Core Global Tool์„ ๋งŒ๋“ค์–ด๋ดค์–ด์š” . ์–ด๋– ์…จ๋‚˜์š”? ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹จ์ˆœํ•œ ๋„๊ตฌ๋ถ€ํ„ฐ ์‹ค์šฉ์ ์ธ ๊ฐœ๋ฐœ ๋„๊ตฌ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ์–ด์š”! ๐ŸŽ‰

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ํŒ€์˜ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๋ฉด, ๋ชจ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ฃ . ์ด๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

๐ŸŒ .NET Core Global Tools ๋ฐฐํฌํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฉ‹์ง„ Global Tool์„ ๋งŒ๋“ค์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ด๊ฑธ ์šฐ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ์•„๊น์ง€ ์•Š๋‚˜์š”? ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ณต์œ ํ•ด๋ณผ๊นŒ์š”? Global Tool์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…์‹œ๋‹ค! ๐Ÿš€

1๏ธโƒฃ NuGet ํŒจํ‚ค์ง€ ์ค€๋น„ํ•˜๊ธฐ

Global Tool์„ ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋จผ์ € NuGet ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ด์š”. ๋‹คํ–‰ํžˆ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด ๊ณผ์ •์„ ๊ฑฐ์ณค์ฃ ! dotnet pack ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ./nupkg ํด๋”์— .nupkg ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ NuGet ๊ณ„์ • ๋งŒ๋“ค๊ธฐ

์•„์ง NuGet ๊ณ„์ •์ด ์—†๋‹ค๋ฉด, NuGet ์›น์‚ฌ์ดํŠธ์—์„œ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”. ์ด ๊ณ„์ •์„ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

3๏ธโƒฃ API ํ‚ค ์ƒ์„ฑํ•˜๊ธฐ

NuGet์— ๋กœ๊ทธ์ธํ•œ ํ›„, 'API Keys' ์„น์…˜์—์„œ ์ƒˆ๋กœ์šด API ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”. ์ด ํ‚ค๋Š” ํŒจํ‚ค์ง€๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. API ํ‚ค๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•ด์•ผ ํ•ด์š”!

โš ๏ธ ์ฃผ์˜: API ํ‚ค๋Š” ์ ˆ๋Œ€๋กœ ๊ณต๊ฐœ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊นƒํ—ˆ๋ธŒ ๊ฐ™์€ ๊ณต๊ฐœ ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”!

4๏ธโƒฃ ํŒจํ‚ค์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ

์ด์ œ ์ค€๋น„ํ•œ ํŒจํ‚ค์ง€๋ฅผ NuGet์— ์—…๋กœ๋“œํ•  ์ฐจ๋ก€์˜ˆ์š”. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ํŒจํ‚ค์ง€๋ฅผ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

dotnet nuget push ./nupkg/CodeStyleChecker.1.0.0.nupkg --api-key YOUR_API_KEY --source https://api.nuget.org/v3/index.json

์ด ๋ช…๋ น์—์„œ YOUR_API_KEY ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹ค์ œ API ํ‚ค๋กœ ๊ต์ฒดํ•ด์ฃผ์„ธ์š”.

5๏ธโƒฃ ํŒจํ‚ค์ง€ ํ™•์ธํ•˜๊ธฐ

์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, NuGet ์›น์‚ฌ์ดํŠธ์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ํŒจํ‚ค์ง€ ํŽ˜์ด์ง€์—์„œ๋Š” ์„ค์น˜ ๋ฐฉ๋ฒ•, ๋ฒ„์ „ ์ •๋ณด, ๋‹ค์šด๋กœ๋“œ ํ†ต๊ณ„ ๋“ฑ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6๏ธโƒฃ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ Global Tool์ด ์„ธ์ƒ์— ๊ณต๊ฐœ๋˜์—ˆ์–ด์š”! ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์•Œ๋ ค์ฃผ์„ธ์š”. ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, ์†Œ์…œ ๋ฏธ๋””์–ด์— ๊ณต์œ ํ•˜๊ฑฐ๋‚˜, ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์†Œ๊ฐœํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

๐Ÿ’ก ํŒ: README ํŒŒ์ผ์„ ์ž˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”. ๋„๊ตฌ์˜ ๊ธฐ๋Šฅ, ์„ค์น˜ ๋ฐฉ๋ฒ•, ์‚ฌ์šฉ ์˜ˆ์ œ ๋“ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. ์ข‹์€ ๋ฌธ์„œ๋Š” ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ์–ด๋“ค์ผ ์ˆ˜ ์žˆ์–ด์š”!

7๏ธโƒฃ ์ง€์†์ ์ธ ๊ด€๋ฆฌ์™€ ์—…๋ฐ์ดํŠธ

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

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

๐ŸŽ‰ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!

์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ ์ž์‹ ๋งŒ์˜ .NET Core Global Tool์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๋ฐฐ์› ์–ด์š”! ์ด๋Š” ์ •๋ง ๋Œ€๋‹จํ•œ ์„ฑ๊ณผ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ๋„๊ตฌ๊ฐ€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ณ , ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜๋ ฅ์„ ๋งˆ์Œ๊ป ๋ฐœํœ˜ํ•ด๋ณด์„ธ์š”. ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‚˜์š”? ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด๋ฉด ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ๋„์ „ํ•ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๊ผญ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ด์ฃผ์„ธ์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํฐ ์˜๊ฐ์„ ์ค„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Š

๐Ÿค” ๋งˆ๋ฌด๋ฆฌ: ์ƒ๊ฐํ•ด๋ณผ ์ ๊ณผ ๋‹ค์Œ ๋‹จ๊ณ„

์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ .NET Core Global Tools์˜ ๊ฐœ๋ฐœ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ „ ๊ณผ์ •์„ ์‚ดํŽด๋ดค์–ด์š”. ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ฃ ? ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์—์š”. ๊ฐœ๋ฐœ์ž๋กœ์„œ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐํ•ด๋ณผ ์ ๊ณผ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์–ด์š”. ๐ŸŒฑ

๐Ÿง  ์ƒ๊ฐํ•ด๋ณผ ์ 

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

๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„

  1. ํ…Œ์ŠคํŠธ ๊ฐ•ํ™”ํ•˜๊ธฐ: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋„๊ตฌ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์—ฌ๋ณด์„ธ์š”.
  2. ๋ฌธ์„œํ™” ๊ฐœ์„ ํ•˜๊ธฐ: ์ƒ์„ธํ•œ ์‚ฌ์šฉ ์„ค๋ช…์„œ, API ๋ฌธ์„œ ๋“ฑ์„ ์ž‘์„ฑํ•ด ์‚ฌ์šฉ์ž๋“ค์˜ ์ดํ•ด๋ฅผ ๋•์Šต๋‹ˆ๋‹ค.
  3. ์ปค๋ฎค๋‹ˆํ‹ฐ ๋งŒ๋“ค๊ธฐ: GitHub ๋“ฑ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ธฐ์—ฌ๋ฅผ ๋ฐ›์•„๋ณด์„ธ์š”.
  4. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•ํ•˜๊ธฐ: ์ž๋™ํ™”๋œ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๊ณผ์ •์„ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  5. ๋‹ค๋ฅธ ํ”Œ๋žซํผ ์ง€์›ํ•˜๊ธฐ: .NET Core์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํŠน์„ฑ์„ ํ™œ์šฉํ•ด Windows, macOS, Linux ๋ชจ๋‘์—์„œ ๋™์ž‘ํ•˜๋Š” ๋„๊ตฌ๋กœ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”.

๐Ÿ’ก ์•„์ด๋””์–ด: ์—ฌ๋Ÿฌ๋ถ„์˜ Global Tool์„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ๋„๊ตฌ๋‚˜ ์„œ๋น„์Šค์™€ ์—ฐ๋™ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, Slack ๋ด‡๊ณผ ์—ฐ๋™ํ•ด ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ ์ฑ„๋„์— ๋ณด๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ์‹์˜ ํ™•์žฅ์€ ๋„๊ตฌ์˜ ๊ฐ€์น˜๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

๐ŸŒŸ ๋งˆ์ง€๋ง‰์œผ๋กœ...

์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  ๋„๊ตฌ๊ฐ€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์ผ์ƒ์„ ์กฐ๊ธˆ์ด๋ผ๋„ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์ด์•ผ๋ง๋กœ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๋Š๋‚„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ณด๋žŒ์ด ์•„๋‹๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ๋…ธ๋ ฅ๊ณผ ์ฐฝ์˜์„ฑ์ด ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ํ•ญ์ƒ ๊ธฐ์–ตํ•˜์„ธ์š”.

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”. ๊ฐœ๋ฐœ์€ ํ˜ผ์ž ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์—์š”. ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)๊ฐ™์€ ํ”Œ๋žซํผ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ„๊ณ , ์„œ๋กœ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ธฐํšŒ๋ฅผ ๊ฐ€์ ธ๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์‹๊ณผ ๊ฒฝํ—˜์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒ ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๐Ÿ˜Š

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋ฉ‹์ง„ .NET Core Global Tool์„ ๋งŒ๋“ค ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”? ์„ธ์ƒ์„ ๋ณ€ํ™”์‹œํ‚ฌ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์š”. ํ™”์ดํŒ…! ๐Ÿš€๐ŸŒŸ