패키지 매니저

Vais는 vaisc CLI에 통합된 강력한 패키지 매니저를 제공합니다. 의존성 관리, 버전 해결, 워크스페이스 지원 등 현대적인 언어 생태계에 필요한 모든 기능을 갖추고 있습니다.

개요

Vais 패키지 매니저는 다음 기능을 제공합니다:

  • 프로젝트 초기화 (vais init) — 새 프로젝트 생성
  • 의존성 설치 (vais install) — path/레지스트리 의존성 자동 해결
  • 패키지 배포 (vais publish) — 레지스트리에 패키지 게시
  • SemVer 관리 — caret/tilde 버전 범위, 충돌 감지
  • 워크스페이스 — 멀티 크레이트 프로젝트 지원
  • Lockfile — 재현 가능한 빌드 보장
  • 문서 생성 — Markdown/HTML 자동 생성

패키지 레지스트리는 Axum과 SQLite 기반으로 구현되어 있습니다.

프로젝트 생성

새 프로젝트 초기화

# 바이너리 프로젝트 생성
vais init my-app

# 라이브러리 프로젝트 생성
vais init my-lib --template lib

# 현재 디렉토리에 초기화
vais init

디렉토리 구조

프로젝트 초기화 후 다음과 같은 구조가 생성됩니다:

my-app/
├── Vais.toml          # 매니페스트 파일
├── src/
│   └── main.vais      # 진입점 (바이너리)
│   └── lib.vais       # 진입점 (라이브러리)
└── .gitignore         # Git 무시 파일

Vais.toml 매니페스트

프로젝트 설정은 Vais.toml 파일에 정의됩니다:

[package]
name = "my-app"
version = "0.1.0"
authors = ["Your Name <your@email.com>"]
edition = "2024"
description = "A Vais application"
license = "MIT"
repository = "https://github.com/username/my-app"

[dependencies]
# 의존성 목록

[dev-dependencies]
# 개발 전용 의존성

[[bin]]
name = "my-app"
path = "src/main.vais"

[lib]
name = "my-lib"
path = "src/lib.vais"

템플릿

두 가지 템플릿을 제공합니다:

  • bin (기본값) — 실행 가능한 바이너리 프로젝트
  • lib — 라이브러리 프로젝트

라이브러리는 다른 프로젝트에서 의존성으로 사용할 수 있습니다.

의존성 관리

의존성 추가

Vais.toml[dependencies] 섹션에 의존성을 추가합니다:

[dependencies]
# 레지스트리 의존성 (SemVer 버전)
vais-json = "0.1.0"
vais-regex = "^0.2.0"  # >= 0.2.0, < 0.3.0
vais-uuid = "~0.1.5"   # >= 0.1.5, < 0.2.0

# path 의존성 (로컬 개발)
my-utils = { path = "../my-utils" }

# Git 의존성
vais-http = { git = "https://github.com/vaislang/vais-http", branch = "main" }

SemVer 버전 관리

Vais는 Semantic Versioning 2.0을 따릅니다:

  • 정확한 버전: "0.1.0" — 정확히 0.1.0
  • Caret 요구사항: "^0.1.0" — >= 0.1.0, < 0.2.0 (major 0일 때는 minor 고정)
  • Tilde 요구사항: "~0.1.5" — >= 0.1.5, < 0.2.0 (patch만 업데이트)
  • 와일드카드: "0.1.*" — 0.1.x의 모든 버전

Path 의존성

로컬 개발 시 path 의존성을 사용합니다:

[dependencies]
shared = { path = "../shared" }

이는 monorepo 환경이나 워크스페이스에서 유용합니다.

패키지 설치

의존성 설치

# Vais.toml의 모든 의존성 설치
vais install

# 특정 패키지 추가 및 설치
vais install vais-json

# 개발 의존성 포함 설치
vais install --dev

의존성 해결 알고리즘

Vais 패키지 매니저는 다음 알고리즘을 사용합니다:

  1. 전이적 의존성 수집 — 모든 직간접 의존성 탐색
  2. SemVer 제약 해결 — 버전 범위 충돌 감지 및 해결
  3. 다이아몬드 의존성 처리 — 공통 의존성의 최적 버전 선택

예시:

my-app
├── pkg-a ^1.2.0
│   └── pkg-c ^2.0.0
└── pkg-b ~1.5.0
    └── pkg-c ~2.3.0

이 경우 pkg-c의 버전은 2.3.x 범위에서 선택됩니다 (두 제약 모두 만족).

충돌 감지

호환되지 않는 버전 요구사항이 있을 경우 컴파일 에러가 발생합니다:

Error: Version conflict detected
  pkg-a requires pkg-c ^2.0.0
  pkg-b requires pkg-c ^3.0.0
  No version satisfies both constraints

Lockfile

Vais.lock 파일

vais install 실행 시 Vais.lock 파일이 생성됩니다:

# This file is automatically generated by Vais package manager.
# Do not edit manually.

[[package]]
name = "vais-json"
version = "0.1.2"
source = "registry+https://registry.vaislang.org"
checksum = "a3f2b..."

[[package]]
name = "my-utils"
version = "0.1.0"
source = "path+../my-utils"

[[package]]
name = "my-app"
version = "0.1.0"
dependencies = [
    "vais-json 0.1.2",
    "my-utils 0.1.0"
]

결정적 직렬화

Lockfile은 다음을 보장합니다:

  • 재현 가능한 빌드 — 동일한 의존성 버전으로 빌드
  • 체크섬 검증 — 패키지 무결성 확인
  • 알파벳 순 정렬 — Git diff 친화적

버전 관리

Lockfile은 반드시 버전 관리에 포함시켜야 합니다:

git add Vais.lock
git commit -m "Update dependencies"

워크스페이스

멀티 크레이트 프로젝트

여러 패키지를 하나의 저장소에서 관리할 수 있습니다:

my-workspace/
├── Vais.toml          # 워크스페이스 루트
├── app/
│   ├── Vais.toml
│   └── src/main.vais
├── lib/
│   ├── Vais.toml
│   └── src/lib.vais
└── utils/
    ├── Vais.toml
    └── src/lib.vais

워크스페이스 설정

루트 Vais.toml에 워크스페이스 정의:

[workspace]
members = [
    "app",
    "lib",
    "utils"
]

# 공통 의존성 (모든 멤버에 적용)
[workspace.dependencies]
vais-json = "0.1.0"

멤버 간 의존성

워크스페이스 멤버는 서로를 path 의존성으로 사용할 수 있습니다:

# app/Vais.toml
[dependencies]
lib = { path = "../lib" }
utils = { path = "../utils" }

워크스페이스 빌드

# 모든 멤버 빌드
vais build --workspace

# 특정 멤버만 빌드
vais build -p app

# 모든 멤버 테스트
vais test --workspace

패키지 배포

레지스트리 계정 설정

패키지를 배포하려면 레지스트리 계정이 필요합니다:

# 레지스트리 로그인
vais login

# API 토큰 설정
vais config set registry.token <YOUR_TOKEN>

배포 절차

# 배포 전 검증
vais publish --dry-run

# 패키지 배포
vais publish

배포 시 다음 검증이 수행됩니다:

  • Vais.toml 필수 필드 확인 (name, version, description, license)
  • 테스트 실행 (cargo test)
  • 문서 생성 확인

배포 요청 구조

vais publish는 다음 형식으로 패키지를 아카이브합니다:

{
  "name": "my-package",
  "version": "0.1.0",
  "description": "My Vais package",
  "tarball": "<base64-encoded .tar.gz>"
}

버전 관리 모범 사례

  • Breaking changes — major 버전 증가 (1.0.0 → 2.0.0)
  • New features — minor 버전 증가 (1.0.0 → 1.1.0)
  • Bug fixes — patch 버전 증가 (1.0.0 → 1.0.1)
  • 0.x.y 버전 — 불안정 API, 언제든 변경 가능

문서 생성

Markdown 문서

소스 코드에서 자동으로 문서를 생성합니다:

# Markdown 문서 생성
vais doc --format markdown

# HTML 문서 생성 (기본값)
vais doc

# 출력 디렉토리 지정
vais doc --output ./docs

문서화 주석

Vais는 특수 주석으로 문서를 작성합니다:

# Adds two numbers together.
#
# ## Arguments
# - `a` — first operand
# - `b` — second operand
#
# ## Returns
# The sum of a and b
#
# ## Example
# ```vais
# result := add(5, 3)
# # result == 8
# ```
P F add(a: i64, b: i64) -> i64 {
    R a + b
}

생성된 문서는 함수 시그니처, 설명, 예제를 포함합니다.

HTML 문서

HTML 문서는 다음 구조로 생성됩니다:

target/doc/
├── index.html
├── my-package/
│   ├── index.html
│   ├── fn.add.html
│   └── struct.MyStruct.html
└── static/
    ├── main.css
    └── main.js

공식 패키지

Vais 생태계는 다음 공식 패키지를 제공합니다:

데이터 형식

  • vais-json — JSON 파싱 및 직렬화
  • vais-csv — CSV 파싱 및 생성

암호화 및 해싱

  • vais-aes — AES-256 암호화 (ECB/CBC/CTR 모드)
  • vais-sha256 — SHA-256 해싱 (FIPS 180-4)
  • vais-crc32 — CRC32 체크섬

압축

  • vais-lz4 — LZ4 압축 및 해제

인코딩

  • vais-base64 — Base64 인코딩/디코딩
  • vais-uuid — UUID 생성 및 파싱

텍스트 처리

  • vais-regex — 정규 표현식 매칭

사용 예시

[dependencies]
vais-json = "0.1.0"
vais-regex = "0.1.0"
vais-uuid = "0.1.0"
U json::{parse, stringify}
U uuid::v4

F main() {
    # JSON 파싱
    data := parse(~{"name": "Vais", "version": 1})!

    # UUID 생성
    id := v4()
    println(~"Generated UUID: {id}")
}

추가 명령어

패키지 검색

# 레지스트리에서 패키지 검색
vais search json

# 카테고리로 필터링
vais search --category crypto

보안 감사

# 의존성 보안 취약점 검사
vais audit

# 자세한 보고서 출력
vais audit --verbose

캐시 관리

# 캐시 상태 확인
vais cache info

# 캐시 정리
vais cache clean

# 특정 패키지 캐시 제거
vais cache remove vais-json

의존성 트리

# 전체 의존성 트리 표시
vais tree

# 특정 패키지의 의존성 추적
vais tree --package vais-json

# 중복 의존성 표시
vais tree --duplicates

벤더링

# 모든 의존성을 vendor/ 디렉토리에 복사
vais vendor

# 오프라인 빌드를 위한 벤더링
vais vendor --sync

벤더링은 오프라인 환경이나 빌드 재현성이 중요한 경우에 유용합니다. vendor/ 디렉토리를 버전 관리에 포함하면 네트워크 없이도 빌드가 가능합니다.

트러블슈팅

의존성 해결 실패

Error: Could not resolve dependencies
  Conflicting versions for pkg-x

해결책: Vais.toml에서 버전 제약을 완화하거나 Vais.lock 삭제 후 재설치

Lockfile 불일치

Error: Vais.lock is out of sync with Vais.toml

해결책:

rm Vais.lock
vais install

레지스트리 연결 실패

Error: Failed to connect to registry

해결책: 네트워크 연결 확인 또는 프록시 설정

vais config set http.proxy http://proxy.example.com:8080

추가 정보