Skip to content

Plugins development ko KR

ArchiBot edited this page Aug 7, 2026 · 12 revisions

ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ

ASF๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ๋ช…๋ น์–ด ์ถ”๊ฐ€, ์‚ฌ์šฉ์ž ์ง€์ • ๊ฑฐ๋ž˜ ๋กœ์ง, ํ˜น์€ ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค ๋ฐ API์™€์˜ ์ „์ฒด ํ†ตํ•ฉ ๋“ฑ์„ ํ†ตํ•ด ASF์˜ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ๊ด€์ ์—์„œ ASF ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค - ์ƒ์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ, ๋ฐฐํฌ ๋“ฑ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๋ณด๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด **์—ฌ๊ธฐ**๋กœ ์ด๋™ํ•˜์„ธ์š”.


์ฝ”์–ด

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ASF์— ์„ ์–ธ๋œ ๊ณตํ†ต IPlugin ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํ‘œ์ค€ .NET ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ASF API๊ฐ€ ํ˜ธํ™˜๋˜๋Š” ํ•œ, ๋ฉ”์ธ๋ผ์ธ ASF์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ํ˜„์žฌ ๋ฐ ํ–ฅํ›„ ASF ๋ฒ„์ „์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ASF์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์€ System.Composition์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋Š” ์˜ˆ์ „์— **Managed Extensibility Framework**๋กœ ์•Œ๋ ค์กŒ๋˜ ๊ฒƒ์œผ๋กœ, ASF๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ค‘ ์‚ฌ์šฉ์ž์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.


์‹œ์ž‘ํ•˜๊ธฐ

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

ํ”„๋กœ์ ํŠธ๋Š” compilation ์„น์…˜์— ๋ช…์‹œ๋œ ๋Œ€๋กœ, ๋Œ€์ƒ ASF ๋ฒ„์ „์— ๋งž๋Š” ์ ์ ˆํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ํ‘œ์ค€ .NET ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋Š” ๋ฉ”์ธ ArchiSteamFarm ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฆด๋ฆฌ์Šค์˜ ์ผ๋ถ€๋กœ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ArchiSteamFarm.dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜, ์†Œ์Šค ํ”„๋กœ์ ํŠธ(์˜ˆ: ASF ํŠธ๋ฆฌ๋ฅผ ์„œ๋ธŒ๋ชจ๋“ˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ•œ ๊ฒฝ์šฐ)๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ASF์˜ ๊ตฌ์กฐ, ๋ฉ”์„œ๋“œ, ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์ƒ์†๋ฐ›์•„์•ผ ํ•  ํ•ต์‹ฌ IPlugin ์ธํ„ฐํŽ˜์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” ์ตœ์†Œํ•œ System.Composition.AttributedModel๋„ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด IPlugin์„ ASF๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก [Export]ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„, ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์‹ถ๊ฑฐ๋‚˜ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ช…์‹œ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ง€๊ธˆ์€ ์ด ์ •๋„๋กœ๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ csproj๋Š” ์•„๋ž˜์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <!-- Since you're loading plugin into the ASF process, which already includes those dependencies, IncludeAssets="compile" allows you to omit them from the final output -->
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" Version="10.0.0" />
    <PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" Version="10.0.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="C:\\Path\To\ArchiSteamFarm\ArchiSteamFarm.csproj" ExcludeAssets="all" Private="false" />

    <!-- If building with downloaded DLL binary, use this instead of <ProjectReference> above -->
    <!-- <Reference Include="ArchiSteamFarm" HintPath="C:\\Path\To\Downloaded\ArchiSteamFarm.dll" /> -->
  </ItemGroup>
</Project>

์ฝ”๋“œ ์ธก๋ฉด์—์„œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ํด๋ž˜์Šค๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘ ASF๊ฐ€ ์ด๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก IPlugin ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋” ํŠนํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค, ์˜ˆ๋ฅผ ๋“ค์–ด IASF๋ฅผ ํ†ตํ•ด ์•”๋ฌต์ ์œผ๋กœ ์ƒ์†ํ•˜๋“ , ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์†ํ•˜๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค) ๊ทธ๋ฆฌ๊ณ  [Export(typeof(IPlugin))]๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ถฉ์กฑํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

using System;
using System.Composition;
using System.Threading.Tasks;
using ArchiSteamFarm;
using ArchiSteamFarm.Plugins;

namespace YourNamespace.YourPluginName;

[Export(typeof(IPlugin))]
public sealed class YourPluginName : IPlugin {
	public string Name => nameof(YourPluginName);
	public Version Version => typeof(YourPluginName).Assembly.GetName().Version;

	public Task OnLoaded() {
		ASF.ArchiLogger.LogGenericInfo("Hello World!");

		return Task.CompletedTask;
	}
}

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € ์ด๋ฅผ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” IDE์—์„œ ์ง์ ‘ ํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# If your project is standalone (no need to define its name since it's the only one)
dotnet publish -c "Release" -o "out"

# If your project is part of ASF source tree (to avoid compiling unnecessary parts)
dotnet publish YourPluginName -c "Release" -o "out"

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

์ด๋Š” ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์—ฌ๋Ÿฌ๋ถ„ ์ž์‹ ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋™์ž‘๋“ค์„ ์œ ์šฉํ•œ ์ฃผ์„๊ณผ ํ•จ๊ป˜ ๋ณด์—ฌ์ฃผ๋Š” ExamplePlugin ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ์œผ์‹œ๊ฑฐ๋‚˜, ArchiSteamFarm.Plugins ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ์‚ดํŽด๋ณด๊ณ  ํฌํ•จ๋œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์˜ต์…˜์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์‚ดํŽด๋ณด์„ธ์š”. ์•„๋ž˜์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐœ๋…๋„ ๋” ์ž์„ธํžˆ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋Œ€์‹  ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐ์šฐ๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ์ €ํฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์—ฌ๋Ÿฌ ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ItemsMatcher, MobileAuthenticator, SteamTokenDumper ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„, ์ €ํฌ ์„œ๋“œํŒŒํ‹ฐ ์„น์…˜์—๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐœ๋ฐœํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


API ๊ฐ€์šฉ์„ฑ

ASF๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ์™ธ์—๋„, ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ๋‚ด๋ถ€ API๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Steam ์›น์— ์ƒˆ๋กœ์šด ํ˜•ํƒœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ €ํฌ๊ฐ€ ์ด์ „์— ์ด๋ฏธ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ๋˜ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์„ ๋‹ค์‹œ ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ธ์ฆ, ์„ธ์…˜ ๊ฐฑ์‹ , ์›น ์†๋„ ์ œํ•œ(web limiting) ๋“ฑ ์ €์ˆ˜์ค€์˜ ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” UrlWithSession() ๋ฉ”์„œ๋“œ๋ฅผ ์ด๋ฏธ ๋งŽ์ด ์ œ๊ณตํ•˜๋Š” ์ €ํฌ Bot.ArchiWebHandler๋ฅผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, Steam ํ”Œ๋žซํผ ์™ธ๋ถ€๋กœ ์›น ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด ํ‘œ์ค€ .NET HttpClient ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์‹คํŒจํ•œ ์š”์ฒญ ์žฌ์‹œ๋„ ๋“ฑ์—์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋„์›€์„ ์ฃผ๋Š” Bot.ArchiWebHandler.WebBrowser๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

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

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


API ํ˜ธํ™˜์„ฑ

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

์ €ํฌ๋Š” ASF์˜ ๊ณต๊ฐœ๋œ ๋ถ€๋ถ„์„ ์ตœ๋Œ€ํ•œ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜๊ฒ ์ง€๋งŒ, ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ €ํฌ ์‚ฌ์šฉ ์ค‘๋‹จ(deprecation) ์ •์ฑ…์— ๋”ฐ๋ผ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ๊ฒƒ๋„ ์ฃผ์ €ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ASF ์ธํ”„๋ผ์˜ ์ผ๋ถ€๋กœ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋…ธ์ถœ๋œ ๋‚ด๋ถ€ ๊ตฌ์กฐ(์˜ˆ: ArchiWebHandler)์™€ ๊ด€๋ จํ•ด ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ํ–ฅํ›„ ASF ๊ฐœ์„ ์˜ ์ผํ™˜์œผ๋กœ ๊ฐœ์„ (๋”ฐ๋ผ์„œ ์žฌ์ž‘์„ฑ)๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ๋ณ€๊ฒฝ ๋กœ๊ทธ(changelog)์—์„œ ์ด๋ฅผ ์ ์ ˆํžˆ ์•ˆ๋‚ดํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ์ค‘ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”(obsolete) ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์žฌ์ž‘์„ฑ ์ž์ฒด๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์˜๋„๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋งˆ์ด๋„ˆ ASF ๋ฒ„์ „์ด ๋‹จ์ง€ ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ๋” ๋†’๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์™„์ „ํžˆ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์–ด๋А ์ •๋„ ํ™•์‹ ํ•˜์…”๋„ ์ข‹์ง€๋งŒ, ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ฃผ์‹œํ•˜๊ณ  ๊ฐ€๋”์”ฉ ์ •์ƒ ์ž‘๋™ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๋‹ค.


ํ”Œ๋Ÿฌ๊ทธ์ธ ์ข…์†์„ฑ(dependencies)

์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์†Œ ๋‘ ๊ฐ€์ง€ ์ข…์†์„ฑ์„ ํฌํ•จํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ API๋ฅผ ์œ„ํ•œ ArchiSteamFarm ์ฐธ์กฐ(์ตœ์†Œ IPlugin)์™€, ASF ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ธ์‹๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ([Export] ์ ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ) System.Composition.AttributedModel์˜ PackageReference์ž…๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ž‘์—…์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ์ข…์†์„ฑ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Discord์™€ ํ†ตํ•ฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๋ฉด Discord.Net ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ).

๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์—๋Š” ํ•ต์‹ฌ YourPluginName.dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€, ์—ฌ๋Ÿฌ๋ถ„์ด ์ฐธ์กฐํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํ•จ๊ป˜ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋™์ž‘ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ASF๊ฐ€ ์ด๋ฏธ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ข…์†์„ฑ(์˜ˆ: ArchiSteamFarm, SteamKit2, AngleSharp)์€ ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์˜คํžˆ๋ ค ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ASF์™€ ๊ณต์œ ๋˜๋Š” ์ข…์†์„ฑ์„ ๋นŒ๋“œ์—์„œ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ๋™์ž‘์„ ์œ„ํ•œ ์ ˆ๋Œ€์ ์ธ ํ•„์ˆ˜ ์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋™์‹œ์— ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ASF๊ฐ€ ์ž์‹ ์˜ ์ข…์†์„ฑ์„ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•˜๊ณ , ASF๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ, ASF๊ฐ€ ํฌํ•จํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ/ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ๋กœ๋Š” ๋‹น์—ฐํžˆ YourPluginName.dll์ด ์žˆ์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด Discord.Net.dll๋„ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ASF๋Š” ์ด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. API ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด(์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ๋ถ„์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์˜์กดํ•˜๋Š” AngleSharp๊ฐ€ ํ•ญ์ƒ X ๋ฒ„์ „์ด๋„๋ก ๋ณด์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ASF๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ฒ„์ „์ด ์•„๋‹ˆ๋ผ) ASF์™€ ๊ณต์œ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฒˆ๋“ค๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ๋„ ์—ฌ์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ/ํฌ๊ธฐ ์ฆ๊ฐ€์™€ ์„ฑ๋Šฅ ์ €ํ•˜๋ผ๋Š” ๋Œ€๊ฐ€๋ฅผ ์น˜๋ฅด๊ฒŒ ๋˜๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์ข…์†์„ฑ์ด ASF์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ์œ„ csproj ์˜ˆ์‹œ์—์„œ ๋ณด์—ฌ๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ IncludeAssets="compile"๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํ•ด๋‹น ์ฐธ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋Š” ๊ฒŒ์‹œ(publish)ํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ASF๊ฐ€ ์ด๋ฏธ ์ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ASF ํ”„๋กœ์ ํŠธ๋ฅผ ExcludeAssets="all" Private="false"๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๋„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค - ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ASF ๊ด€๋ จ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ๋ง๋ผ๊ณ  ์ง€์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ์ด๋Š” ASF ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฒฐ๊ณผ๋ฌผ๋กœ ASF ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„ ์„ค๋ช…์ด ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด, ASF-generic.zip ํŒจํ‚ค์ง€์— ์–ด๋–ค dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค, ์•„์ง ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ํฌํ•จ์‹œํ‚ค์„ธ์š”. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฝ์šฐ, ์ด๋Š” ์˜ค์ง YourPluginName.dll๋ฟ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ค‘ ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ํ•ด๋‹น ์˜ํ–ฅ์„ ๋ฐ›์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํ•จ๊ป˜ ํฌํ•จ์‹œ์ผœ ์ฃผ์„ธ์š”. ๊ทธ ์™ธ ๋ชจ๋“  ๋ฐฉ๋ฒ•์ด ํ†ตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์–ธ์ œ๋“  ๋ชจ๋“  ๊ฒƒ์„ ๋ฒˆ๋“ค๋กœ ํฌํ•จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


๋„ค์ดํ‹ฐ๋ธŒ ์ข…์†์„ฑ

๋„ค์ดํ‹ฐ๋ธŒ ์ข…์†์„ฑ์€ OS๋ณ„(OS-specific) ๋นŒ๋“œ์˜ ์ผํ™˜์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์—๋Š” .NET ๋Ÿฐํƒ€์ž„์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ASF๋Š” OS๋ณ„ ๋นŒ๋“œ์— ํ•จ๊ป˜ ๋ฒˆ๋“ค๋œ ์ž์ฒด .NET ๋Ÿฐํƒ€์ž„์„ ํ†ตํ•ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ASF๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ข…์†์„ฑ์„ ๋‹ค๋“ฌ์–ด(trim) ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์‹ค์ œ๋กœ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋งŒ ํฌํ•จ์‹œํ‚ค๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ASF์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” .NET ๊ธฐ๋Šฅ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ‘์ž๊ธฐ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, OS๋ณ„ ๋นŒ๋“œ์—์„œ๋Š” ์ด๋ฅผ ์ œ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ณดํ†ต System.MissingMethodException ๋˜๋Š” System.Reflection.ReflectionTypeLoadException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ปค์ง€๊ณ  ์ ์  ๋” ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก, ๊ฒฐ๊ตญ ์ €ํฌ OS๋ณ„ ๋นŒ๋“œ๊ฐ€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์˜์—ญ์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

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

์•ˆํƒ€๊น๊ฒŒ๋„, ์ €ํฌ๋Š” OS๋ณ„ ๋นŒ๋“œ์—์„œ ์ „์ฒด ๋Ÿฐํƒ€์ž„์„ ํ•จ๊ป˜ ๋ฐฐํฌํ•  ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ œ์™ธํ•  ๊ฒƒ์ธ์ง€ ์‚ฌ์ด์—์„œ ์–ด๋ ค์šด ์„ ํƒ์„ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›„์ž๋ฅผ ์„ ํƒํ•˜๋ฉด ์ „์ฒด ๋นŒ๋“œ ๋Œ€๋น„ ํฌ๊ธฐ๊ฐ€ 80MB ์ด์ƒ ์ž‘์•„์ง‘๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ํ›„์ž๋ฅผ ์„ ํƒํ–ˆ์œผ๋ฉฐ, ์•ˆํƒ€๊น๊ฒŒ๋„ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ถ€์กฑํ•œ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ ์ง์ ‘ ํฌํ•จ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ (OS๋ณ„ ๋นŒ๋“œ์—์„œ) ์ œ์™ธ๋œ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์˜์กดํ•˜๋Š” ์ „์ฒด .NET ๋Ÿฐํƒ€์ž„์„ ํฌํ•จํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๊ณง ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ generic ASF ๋ฒ„์ „์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. OS๋ณ„ ๋นŒ๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋นŒ๋“œ์—๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ์ด ์•„์˜ˆ ๋น ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ํ˜„์žฌ .NET ๋Ÿฐํƒ€์ž„์€ ์ €ํฌ๊ฐ€ ์ œ๊ณตํ•œ ๊ฒƒ๊ณผ ์—ฌ๋Ÿฌ๋ถ„์ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ข…์†์„ฑ์„ "๋ณ‘ํ•ฉ"ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€ ๋ฏธ๋ž˜์—๋Š” ๊ฐœ์„ ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ˜„์žฌ๋กœ์„œ๋Š” ๋‹จ์ˆœํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

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


์ž๋™ ์—…๋ฐ์ดํŠธ

ASF๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • IGitHubPluginUpdates๋Š” ์ผ๋ฐ˜์ ์ธ ASF ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ GitHub ๊ธฐ๋ฐ˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • IPluginUpdates๋Š” ๋” ์ €์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๋” ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์—…๋ฐ์ดํŠธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • RepositoryName์„ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์œ„์น˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • GitHub์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒœ๊ทธ์™€ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒœ๊ทธ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒ„์ „์œผ๋กœ ํŒŒ์‹ฑ ๊ฐ€๋Šฅํ•œ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: 1.0.0.0).
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ Version ์†์„ฑ์€ ์ด๋ฅผ ๊ฐ€์ ธ์˜จ ํƒœ๊ทธ(tag)์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, 1.2.3.4 ํƒœ๊ทธ ์•„๋ž˜์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” 1.2.3.4๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํƒœ๊ทธ๋งˆ๋‹ค, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ํฌํ•จ๋œ zip ํŒŒ์ผ ๋ฆด๋ฆฌ์Šค ์ž์‚ฐ(release asset)๊ณผ ํ•จ๊ป˜ GitHub์— ์ ์ ˆํ•œ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IPlugin ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์€ zip ํŒŒ์ผ ๋‚ด ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์œ„์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ASF์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ํ˜„์žฌ ์—ฌ๋Ÿฌ๋ถ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ Version์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: 1.0.1).
  • GitHub API๋ฅผ ์‚ฌ์šฉํ•ด RepositoryName ์ €์žฅ์†Œ์—์„œ ์ตœ์‹  tag๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(์˜ˆ: 1.0.2).
  • 1.0.2 > 1.0.1์ž„์„ ํ™•์ธํ•˜๊ณ , 1.0.2 ํƒœ๊ทธ์˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ™•์ธํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋‹ด๊ธด .zip ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น .zip ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ•ด์ œํ•œ ๋’ค, ๊ทธ ๋‚ด์šฉ์„ ์ด์ „์— YourPlugin.dll์ด ์žˆ๋˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ASF๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์—ฌ 1.0.2 ๋ฒ„์ „์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์‚ฌํ•ญ:

  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ ์ ˆํ•œ ASF ์„ค์ • ๊ฐ’, ์ฆ‰ PluginsUpdateMode ๋ฐ/๋˜๋Š” PluginsUpdateList ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €ํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ…œํ”Œ๋ฆฟ์—๋Š” ์ด๋ฏธ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋‹จ์ˆœํžˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ์ด๋ฆ„ ๋ณ€๊ฒฝ(rename) ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฐ”๋กœ ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์™€ ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ UpdateChannel์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • CanUpdate๋ผ๋Š” ๋ถˆ๋ฆฌ์–ธ(boolean) ์†์„ฑ์ด ์žˆ์–ด, ํ•„์š”์— ๋”ฐ๋ผ(์˜ˆ๋ฅผ ๋“ค์–ด ์ผ์‹œ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์‹ถ๊ฑฐ๋‚˜ ๊ทธ ๋ฐ–์˜ ์ด์œ ๋กœ) ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„ ์ชฝ์—์„œ ๋น„ํ™œ์„ฑํ™”/ํ™œ์„ฑํ™”ํ•˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ASF ๋ฒ„์ „์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ฆด๋ฆฌ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ zip ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GetTargetReleaseAsset()์˜ remarks ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, MyPlugin-V6-0.zip๊ณผ MyPlugin.zip์„ ํ•จ๊ป˜ ๋‘˜ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ V6.0.x.x ๋ฒ„์ „์˜ ASF๋Š” ์ „์ž๋ฅผ ์„ ํƒํ•˜๊ณ , ๊ทธ ์™ธ ๋ชจ๋“  ASF ๋ฒ„์ „์€ ํ›„์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์œ„ ๋ฐฉ์‹๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ .zip ํŒŒ์ผ์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, GetTargetReleaseAsset() ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ASF๊ฐ€ ์‚ฌ์šฉํ•  ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—…๋ฐ์ดํŠธ ์ „/ํ›„์— ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, OnPluginUpdateProceeding() ๋ฐ/๋˜๋Š” OnPluginUpdateFinished() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š”, IGithubPluginUpdates๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ„์ „์œผ๋กœ ํŒŒ์‹ฑ๋˜์ง€ ์•Š๋Š” ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์• ์ดˆ์— GitHub ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ) ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์•ผ ํ•  ํ•จ์ˆ˜๋Š” ๋‹จ ํ•˜๋‚˜, GetTargetReleaseURL()์ด๋ฉฐ, ์ด ํ•จ์ˆ˜๋Š” ๋Œ€์ƒ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—…๋ฐ์ดํŠธ ์œ„์น˜์˜ Uri?๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ASF๋Š” ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ปจํ…์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์˜ ๋‚˜๋จธ์ง€ ํ•„์š”ํ•œ ๋กœ์ง์€ ๋ชจ๋‘ ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  URL(๋˜๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ null)์„ ASF์— ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์™ธ์—๋Š” GitHub ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ, URL์€ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ์žˆ๋Š” .zip ํŒŒ์ผ์„ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. OnPluginUpdateProceeding() ๋ฐ OnPluginUpdateFinished() ๋ฉ”์„œ๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

en-US de-DE es-ES lol-US
pt-BR ru-RU zh-CN zh-TW

๐Ÿ‘จโ€๐Ÿซ ๊ธฐ๋ณธ

๐Ÿ‘จโ€๐ŸŽ“๏ธ ๋ฉ”์ธ

๐Ÿง™ ๊ณ ๊ธ‰

๐Ÿ‘ท ๊ฐœ๋ฐœ์ž

Clone this wiki locally