Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

컴포넌트와 WIT 배포 및 가져오기

현대 애플리케이션은 서드파티 패키지에 광범위하게 의존합니다. 그 정도가 매우 커서 패키지 배포는 거의 그 자체로 하나의 산업이 되었습니다. 전통적으로 패키지 배포 서비스는 단일 프로그래밍 언어에 특화되어 있었습니다. 예를 들어, JavaScript 개발자는 NPM의 패키지를 사용하는 데 익숙하며, Rust 개발자는 crates.io를 사용합니다. 일부 런타임은 바이너리 배포와 링킹을 지원하여 제한적인 언어 간 상호 운용성을 제공합니다. 예를 들어, Maven 패키지는 Java 런타임을 대상으로 하는 어떤 언어로든 작성할 수 있습니다. 이러한 서비스는 “패키지 관리자” 또는 “레지스트리” 등 다양한 이름으로 불립니다.

게시와 배포는 핵심 컴포넌트 모델에서 정의되지 않지만, 컴포넌트 생태계의 중요한 부분을 이룹니다. 예를 들어, JavaScript로 작성하면서 C로 작성되어 Wasm으로 컴파일된 고도로 최적화된 머신 러닝 알고리즘을 가져오고 싶다면 레지스트리에서 가져올 수 있으며, 이상적으로는 NPM 레지스트리에서 NPM 패키지를 추가하는 것만큼 쉽게 가져올 수 있습니다.

Bytecode Alliance Packaging Special Interest Group (SIG)에 참여하여 WebAssembly 컴포넌트의 패키징과 호스팅 개선에 참여할 수 있습니다.

wkg 레지스트리 도구

wasm-pkg-tools 프로젝트를 사용하면 Open Container Initiative(OCI) 레지스트리에서 WebAssembly 컴포넌트를 가져오고 해당 레지스트리에 게시할 수 있습니다.

wasm-pkg-tools에는 컴포넌트와 WIT 패키지의 배포 및 가져오기를 쉽게 해 주는 wkg CLI 도구가 포함되어 있습니다. wkg를 사용하는 일반적인 방법은 패키지를 이름으로 지정하는 것입니다. 예를 들면 example:adder@1.0.0와 같습니다. 이 방식으로 wkg를 사용하면 wkg 구성이 패키지의 물리적 위치를 대신 처리하므로, 그 위치를 알 필요가 없습니다. 하지만 필요한 경우 wkg oci 하위 명령을 사용할 때 OCI 참조로 지정하여 wkg로 OCI 아티팩트를 직접 다룰 수도 있습니다.

wkg에는 여러 하위 명령이 있습니다.

  • wkg oci: 임의의 OCI 레지스트리에 WebAssembly 아티팩트를 푸시하거나 해당 레지스트리에서 풀합니다
  • wkg publish: 패키지 이름으로 컴포넌트 또는 WIT 패키지를 게시합니다
  • wkg get: 패키지 이름으로 컴포넌트 또는 WIT 패키지를 풀합니다
  • wkg wit: WIT 파일 및 의존성을 다룹니다
  • wkg config: wkg 구성을 다룹니다

다음 섹션에서는 wkg로 수행할 수 있는 작업 중 일부를 자세히 설명합니다.

wkg 구성 파일

대부분의 wkg 명령(wkg oci는 예외)을 사용할 때는 물리적 위치를 다루지 않고 패키지 이름만 다룹니다. wkg 구성 파일은 패키지 이름을 물리적 위치에 매핑하는 데 사용됩니다. 이 파일로 다음 항목을 구성할 수 있습니다.

  • 특정 네임스페이스에 속한 패키지의 기본 레지스트리입니다. 예를 들어, wasi:clocks나 wasi:http와 같은 wasi 패키지의 위치입니다.
  • 네임스페이스의 나머지 패키지와 같은 위치에 저장되지 않은 특정 패키지에 대한 레지스트리 재정의입니다. 예를 들어, wasi:key-value가 다른 wasi 패키지와 다른 레지스트리에 저장되어 있다면 재정의를 사용합니다.
  • 앞의 항목 중 어디에도 나열되지 않은 모든 패키지의 기본 레지스트리입니다.

구성 파일에는 비공개 레지스트리용 자격 증명이나 권한이 있는 레지스트리에 푸시하기 위한 자격 증명, 그리고 기타 구성 옵션도 포함됩니다. 더 많은 구성 옵션은 wkg 문서를 참조하십시오.

예를 들어 wasi:clocks, wasi:http와 같은 WASI 패키지를 가져오려면 namespace_registries 섹션 아래에 wasi 네임스페이스에 대한 줄을 추가할 수 있습니다. 구체적으로, 아래 예시는 wkg가 WebAssembly OCI GitHub 컨테이너 레지스트리에서 WASI 패키지를 가져오도록 구성하며, 이 레지스트리에는 WASI 릴리스 시 최신 인터페이스가 게시됩니다. wkg 구성 파일을 편집하려면 wkg config --edit를 실행하십시오.

모든 패키지 이름은 네임스페이스 필드와 그 뒤에 오는 패키지 필드로 구성된다는 점을 기억하십시오. 예를 들어 패키지 이름 wasi:clocks의 네임스페이스 필드는 wasi이고 패키지 필드는 clocks입니다. 이러한 방식으로, 다음 구성을 사용하면 wkg는 모든 wasi:<package field>의 가져오기와 게시를 구성된 위치로 라우팅해야 한다는 것을 알게 됩니다.

# $XDG_CONFIG_HOME/wasm-pkg/config.toml
default_registry = "ghcr.io"

[namespace_registries]
# Tell wkg that packages with the `wasi` namespace are in an OCI registry
# under ghcr.io/webassembly
wasi = { registry = "wasi",  metadata = { preferredProtocol = "oci", "oci" = {registry = "ghcr.io", namespacePrefix = "webassembly/" } } }

좀 더 일반적인 예로, 다음 구성은 docs 네임스페이스를 가진 모든 패키지에 대해 ttl.sh OCI 레지스트리를 사용하도록 wkg에 지시합니다.

# $XDG_CONFIG_HOME/wasm-pkg/config.toml
default_registry = "ghcr.io"

[namespace_registries]
# Instruct wkg to use the OCI protocol to fetch packages with the `docs` namespace from ttl.sh/wasm-components
docs = { registry = "docs",  metadata = { preferredProtocol = "oci", "oci" = {registry = "ttl.sh", namespacePrefix = "wasm-components/" } } }

참고: wkg 구성의 package_registry_overrides 섹션에서 레지스트리 이름을 참조하여 네임스페이스의 특정 패키지에 대한 재정의를 제공할 수 있습니다.

wkg publish로 패키지 이름을 통해 WIT와 컴포넌트 배포하기

패키지를 게시할 위치를 지정하도록 wkg를 구성했다면, wkg publish 명령을 사용하여 다른 사람이 사용할 수 있도록 컴포넌트나 인터페이스를 게시할 수 있습니다.

WIT에서 다음과 같은 adder 월드를 정의했다고 가정해 보십시오.

package docs:adder@0.1.0;

interface add {
    add: func(x: u32, y: u32) -> u32;
}

world adder {
    export add;
}

이 WIT를 Wasm 컴포넌트로 감싸서 wkg를 사용해 게시할 수 있습니다. 네, 제대로 들으신 것이 맞습니다! WIT를 Wasm으로 패키징하는 것입니다. 이 월드 파일을 tutorial/wit/adder라는 디렉터리에 저장했다면 다음을 실행할 수 있습니다.

# Package the contents of add WIT directory as Wasm
wkg wit build --wit-dir tutorial/wit/adder
# Publish the produced component
wkg publish docs:adder@0.1.0.wasm

wkg 구성 섹션에서 설명한 대로 wkg를 구성했다면, 이 명령은 컴포넌트를 ttl.sh/wasm-components/docs/adder:0.1.0에 게시합니다. 그런 다음 형식을 wit로 지정하여 wkg get으로 이 WIT를 가져올 수 있습니다.

wkg get --format wit docs:adder@0.1.0 --output adder.wit

WIT 인터페이스를 게시하는 대신, 다음을 실행하여 빌드된 컴포넌트를 게시할 수 있습니다.

wkg publish adder.wasm --package docs:adder@0.1.0

그런 다음 다음을 실행하여 컴포넌트를 가져올 수 있습니다.

wkg get docs:adder@0.1.0 --output adder.wasm

wkg oci를 사용한 좀 더 일반적인 작업

wkg oci 하위 명령을 사용하면 모든 OCI 레지스트리에 Wasm 아티팩트를 푸시하거나 해당 레지스트리에서 풀할 수 있습니다. wkg publish 및 wkg get과 달리 WIT 패키지를 제공할 필요가 없습니다.

컴포넌트를 OCI 레지스트리에 푸시하려면 wkg oci pull을 사용하십시오. 아래 예시는 컴포넌트를 GitHub 컨테이너 레지스트리에 푸시합니다.

wkg oci push ghcr.io/user/component:0.1.0 component.wasm

컴포넌트를 풀하려면 다음을 실행하십시오.

wkg oci pull ghcr.io/user/component:0.1.0 -o component.wasm

wkg를 사용하여 WIT 패키지 의존성 가져오기

패키지가 다른 패키지에 종속되어 있어 단일 패키지를 가져오는 것만으로는 충분하지 않은 경우가 있습니다. 예를 들어 다음 월드는 wasi:http/proxy가 필요한 간단한 Wasm 서비스를 기술합니다.

package foo:wasi-http-service;

world target-world {
  include wasi:http/proxy@0.2.3;
}

wkg get --format wit wasi:http@0.2.3 -o wit/deps/http/로 wasi:http 패키지를 간단히 가져오고 싶을 수도 있습니다. 그러나 wasi:http는 wasi:clocks, wasi:io와 같은 다른 WASI 패키지에 종속됩니다. 패키지와 그 모든 의존성을 확실히 가져오려면 wkg wit fetch를 사용하십시오. 이 명령은 지정된 WIT 디렉터리(기본값은 wit)에 정의한 월드가 포함된 패키지를 읽습니다. 그런 다음 의존성을 가져와 잠금 파일과 함께 deps 하위 디렉터리에 기록합니다. (잠금 파일은 프로젝트에서 사용할 각 의존성의 정확한 버전을 지정합니다.)

위 파일을 ./wit/world.wit로 저장한 후, 다음 명령을 실행하여 의존성을 가져오십시오:

wkg wit fetch

./wit 디렉터리는 다음과 같이 채워집니다:

wit
├── deps
│   ├── wasi-cli-0.2.3
│   │   └── package.wit
│   ├── wasi-clocks-0.2.3
│   │   └── package.wit
│   ├── wasi-http-0.2.3
│   │   └── package.wit
│   ├── wasi-io-0.2.3
│   │   └── package.wit
│   └── wasi-random-0.2.3
│       └── package.wit
└── world.wit

이제 원하는 언어 툴체인을 사용하여 바인딩을 생성하고 컴포넌트를 만들 수 있습니다.


원문 © 2023 The Bytecode Alliance Contributors · WebAssembly Components Documentation · CC BY 4.0
Yeokja 한국어 번역·편집 · Anthropic 사의 claude-sonnet-5 모델을 활용하여 번역되었으며 학습을 모두 비허용한 상태로 작업하였습니다 · 이 번역은 원문을 수정한 문서이며 CC BY 4.0으로 제공합니다.