Move 패키지 관리
Move 패키지는 Sui blockchain에 단일 객체로 함께 게시하는 Move 모듈의 모음이다. 패키지는 다른 패키지에 의존할 수 있으며, 온체인 identity를 유지한 채 시간이 지나도 upgrade할 수 있다. Move 패키지 manager는 dependency를 관리하고 network에 패키지를 게시하는 데 도움을 준다.
Version 1.63은 Move 패키지 system에 큰 변화를 도입했다. 이 문서는 새 system을 설명한다. 이전 system 문서는 자동 주소 관리를 참조하고, 차이점과 새 system으로 마이그레이션하는 방법은 패키지 관리 마이그레이션을 참조한다.
Package 관련 file
패키지 작성자는 패키지 directory 루트에 manifest file(Move.toml)를 제공해 패키지를 구성한다.
이 파일에는 패키지에 대한 메타데이터와 dependency 목록이 들어 있다.
처음으로 Move 패키지를 build할 때 패키지 management system은 manifest file의 정보를 사용해 패키지 dependency의 source code를 찾는다.
system은 dependency의 정확한 version을 lockfile(Move.lock)에 저장한다.
system은 이 과정을 _pinning_이라고 부른다.
예를 들어 manifest가 git repository의 branch를 dependency로 지정할 수 있다. 패키지 system은 그 dependency를 특정 commit에 pinning하여 이후 build가 정확히 같은 source를 사용하도록 한다.
협업자, CI job, source code를 검증하려는 사용자가 모두 같은 dependency version을 사용하도록 Move.lock 파일을 source control에 commit해야 한다.
패 키지 system은 manifest file이 바뀌거나 sui move update-deps 명령을 실행한 경우에만 dependency를 다시 pinning한다.
Move.lock은 수동으로 편집하면 안 된다.
패키지 management system이 사용하는 세 번째 파일은 publication file(Published.toml)이다.
패키지를 게시할 때마다 패키지 system은 온체인 address, upgrade capability address, 패키지 build에 사용한 compiler version 정보 등 publication 메타데이터로 이 파일을 갱신한다.
Published.toml 파일은 source control에 commit해야 한다.
마지막으로 test-publish 명령은 일반적으로 Pub.<env-name>.toml로 이름 붙는 ephemeral publication file을 사용한다.
이 파일에는 local network 게시처럼 공유를 의도하지 않은 임시 게시에 대한 정보가 들어 있다.
이 파일은 source control에 commit하면 안 된다.
Dependency 관리
dependency를 사용하면 패키지가 다른 패키지의 코드를 사용할 수 있다.
Dependency 추가
dependency를 추가하려면 manifest의 [dependencies] 섹션에 줄을 추가한다.
예를 들어 mvr 패키지 @potatoes/ascii에 의존하려면 다음과 같이 작성한다:
[package]
name = "example"
[dependencies]
ascii = { r.mvr = "@potatoes/ascii" }
그런 다음 Move source code에서 ascii 패키지의 모듈을 참조한다:
module example::example_module;
use ascii::ascii;
use ascii::char;
이 패키지를 build하면 패키지 system이 ascii 패키지의 source code를 다운로드하여 사용한다.
게시되면 패키지는 ascii Published.toml file에서 참조한 온체인 패키지 객체에 연결된다.
Dependency type 종류
Move 패키지 system은 각기 다른 사용 사례에 맞는 4가지 dependency type을 지원한다:
- Move registry(
mvr) dependency는 ecosystem에서 게시된 패키지에 의존하는 데 권장되는 방식이다. - local dependency는 단일 repository에 여러 패키지가 들어 있을 때 사용한다.
- git dependency는 아직 Move registry에 게시되지 않은 패키지에 의존할 때 사용할 수 있다.
- system dependency는 Sui에 포함된 built-in 패키지에 사용한다.
이 섹션의 나머지 부분에서는 이러한 dependency type을 자세히 설명한다.
Move registry (mvr) dependency(권장)
다른 패키지에 의존하는 선호 방식은 mvr라고 부르는 Move registry를 사용하는 것이다.
Move registry는 게시된 package를 그 source code와 연결하는 온체인 database이다.
mvr 이름이 @example/package인 패키지에 의존하려면 example = { r.mvr = "@example/package" } 섹션에 [dependencies]를 추가한다.
장점:
- environment(Mainnet 및 Testnet)에 맞는 올바른 version을 자동으로 resolve한다.
- 패키지 source code가 검증되고 이용 가능함을 보장한다.
- 게시된 패키지에 의존하는 가장 단순한 방법이다.
Local dependency 방식
local dependency는 같은 repository 안의 다른 패키지에 의존하고 싶을 때 유용하다.
예를 들어 repository에 packages/a와 packages/b directory에 Move 패키지가 있고 패키지 a가 패키지 b에 의존하길 원한다면 b = { local = "../b" }에 packages/a/Move.toml를 추가한다.
장점:
- 개발 중 빠른 반복 작업이 가능하다.
- 변경 사항을 시험하기 위해 패키지를 게시할 필요가 없다.
- 관련 패키지를 동기화된 상태로 유지할 수 있다.
Git dependency 방식
git dependency는 git repository에 저장된 패키지에 의존할 때 사용할 수 있다.
git dependency에는 repository URL, repository 안에서 패키지를 포함하는 subdirectory, revision(branch, tag 또는 40자 commit hash)이 포함되어야 한다.
예를 들어 usdc 패키지에 dependency를 추가하려면 manifest에 다음을 추가할 수 있다:
[dependencies]
usdc = { git = "https://github.com/circlefin/stablecoin-sui.git", subdir = "packages/usdc", rev = "master" }
manifest file은 TOML로 작성되므로 inline table을 확장해서 쓸 수도 있다. 앞선 예시는 다음과 동일하다:
[dependencies.usdc]
git = "https://github.com/circlefin/stablecoin-sui.git"
subdir = "packages/usdc"
rev = "master"
축약된 commit hash를 사용할 수는 있지만, 그렇게 하면 전체 git history를 다운로드해야 하므로 전체 40자 hash를 포함하는 것보다 효율이 떨어진다.
System dependency 방식
system dependency는 이전 system에는 존재하지 않으며, implicit dependency도 다르게 동작한다.
여러 패키지가 Sui에 built-in으로 포함되어 있다.
system dependency type을 사용해 이러한 패키지에 의존할 수 있다.
사용 가능한 system 패키지는 std, sui, sui_system, bridge, deepbook이다.
하지만 다음 사항에 유의해야 한다:
std섹션에sui를 쓰지 않는 한implicit-dependencies = false와[package]패키지는 암묵적으로 포함된다.- 따라서 이를 명시적으로 포함할 필요는 없다.
deepbooksystem 패키지는 더 이상 사용되지 않는 DeepBook version 2용이다.- 새 application은
deepbook = { mvr = "@deepbook/core" }를 추가해 DeepBook version 3를 사용해야 한다.
system dependency를 포함하려면 { system = "<name>" }라고 작성한다.
예를 들어 sui_system을 사용하려면 sui_system = { system = "sui_system" } 섹션에 [dependencies]를 추가한다.
고급 dependency configuration
rename-from, override, modes처럼 4가지 dependency type 모두에 사용할 수 있는 추가 필드가 있다.
Dependency 이름 변경
rename-from은 이전 system에는 존재하지 않는다.
rename-from 필드는 같은 이름을 가진 여러 패키지에 의존할 때 사용한다.
기본적으로 패키지 system은 dependency에 붙인 이름이 dependency가 스스로 부여한 이름과 같은지 검사한다.
하지만 rename-from 필드를 사용하면 사용하는 이름을 바꿀 수 있다.
예를 들어 @a/math와 @b/math가 모두 math라는 이름의 패키지를 가리킨다면 다음과 같이 작성해 둘 모두에 의존할 수 있다:
[dependencies]
math_a = { r.mvr = "@a/math", rename-from = "math" }
math_b = { r.mvr = "@b/math", rename-from = "math" }
그런 다음 Move code에서는 둘 다 다음처럼 참조할 수 있다:
use math_a::signed;
use math_b::muldiv;
Dependency version override 설정
override flag는 같은 패키지의 서로 다른 version에 의존하는 패키지를 결합할 때 사용한다.
Move 패키지 system은 하나의 패키지 안에서 사용되는 각 패키지의 version이 오직 1개이기를 요구한다.
예를 들어 패키지 a가 패키지 b와 c에 의존하려 하지만 b는 d의 version 1에 의존하고 c는 d의 version 2에 의존한다고 가정하자:
패키지 system은 기본적으로 이를 허용하지 않는데, 이는 패키지 a의 code를 실행하려면 d의 version 1과 2가 모두 필요하기 때문이다.
dependency에 override = true를 추가하면 dependency 전체가 지정된 version의 dependency를 사용하도록 강제한다.
앞선 예시에서는 d version 2에 대한 override dependency를 추가할 수 있고, 그러면 b는 version 1 대신 d의 version 2를 사용하게 된다.
패키지를 더 새로운 version으로 override하는 것만 허용된다.
예시에서 d를 downgrade하게 되므로 c version 1에 대한 override dependency를 추가할 수는 없다.
Test-only 및 mode별 dependency
modes 필드를 사용하면 test mode 같은 특정 mode에서만 사용하는 dependency를 추가할 수 있다.
modes 필드를 제공하지 않으면 dependency는 모든 mode에 포함된다.
예를 들어 ascii dependency를 testing에만 포함하려면 다음과 같이 작성한다:
ascii = { r.mvr = "@potatoes/ascii", modes = ["test"] }
이 dependency는 sui move test를 실행하거나 어떤 -m test 명령에든 sui move를 전달할 때 포함된다.
현재는 서로 다른 mode마다 서로 다른 dependency를 두는 방법은 없고, mode에 따라 dependency를 포함하거나 생략하는 것만 가능하다.