Cargo Deny
cargo-deny는 프로젝트의 의존성 그래프를 린트하여 모든 의존성이 기대와 요구 사항을 준수하는지 확인하는 cargo 플러그인입니다. 라이선스 정책을 적용하고, 안전하지 않거나 원하지 않는 의존성을 탐지하고 방지하며, Rust 프로젝트의 코드 품질을 유지하는 데 도움을 줍니다.
빠른 시작
cargo-deny를 사용하려면 먼저 설치해야 합니다. 터미널에서 다음 명령을 실행하여 설치할 수 있습니다:
cargo install --locked cargo-deny
프로젝트를 기본 설정으로 초기화한 후 모든 체크를 실행합니다.
cargo-deny && cargo deny init && cargo deny check
명령 줄 인터페이스
init 명령(cargo deny init)
cargo-deny의 설정은 다소 복잡하므로, 시작점을 제공하기 위해 템플릿에서 설정 파일을 생성하는 init 명령을 제공합니다.
init 명령은 기본값인 cwd
/deny.toml 대신 사용할 설정 파일의 경로로 경로를 인수로 받을 수 있습니다.
cargo deny init
또는
cargo deny init path/to/deny.toml
check 명령(cargo deny check)
check 명령은 cargo-deny의 주요 서브 명령으로, 실제로 프로젝트에 있는 모든 크레이트를 실행하여 설정과 비교하여 체크합니다.
사용법: cargo-deny check [OPTIONS] [WHICH]...
인자
advisories
advisories 체크는 자문 데이터베이스를 참조하여 크레이트의 문제를 탐지하는 데 사용됩니다.
cargo deny check advisories
bans
bans 체크는 특정 크레이트를 거부(또는 허용)하고, 동일한 크레이트의 여러 버전을 탐지하고 처리하는 데 사용됩니다.
cargo deny check bans
licenses
licenses 체크는 사용하는 모든 크레이트가 수용 가능한 라이선스 조건을 가지고 있는지 확인하는 데 사용됩니다. cargo-deny는 각 크레이트가 지정한 라이선스 요구 사항을 지정한 설정과 비교하여 평가하여 프로젝트가 해당 크레이트의 라이선스 요구 사항을 충족하는지 여부를 결정합니다.
cargo deny check licenses
sources
sources 체크는 크레이트가 신뢰하는 소스에서만 온 것을 보장합니다.
cargo deny check sources
옵션
-A, --allow
린트 허용 설정
--audit-compatible-output cargo-audit에서 cargo-deny로의 전환을 용이하게 하기 위해, 이 플래그는 cargo-deny가 cargo-audit와 동일한 출력을 stdout 대신 stderr로 출력하도록 지시합니다. 이는 cargo-audit과 마찬가지입니다.
이 플래그는 출력 형식이 JSON일 때만 적용되며, cargo-deny가 여러 자문 데이터베이스를 지원하기 때문에 단일 JSON 객체 대신 각 고유 자문 데이터베이스마다 1개가 있음을 유의하세요.
-c, --config 사용할 설정 파일 경로
지정되지 않은 경우 기본값은 cwd/deny.toml입니다
-d, --disable-fetch 자문 데이터베이스 가져오기 비활성화
advisories 체크를 실행할 때, 설정된 자문 데이터베이스가 가져와져 열립니다. 이 플래그를 사용하면 데이터베이스는 가져와지지 않지만, 이미 로컬에 존재하지 않는 경우 오류가 발생합니다.
이 옵션은 전역 옵션에서 --offline 플래그를 사용할 때도 설정됩니다.
--exclude-dev true로 설정하면, 워크스페이스 크레이트를 포함한 모든 dev-의존성은 체크에 사용되는 크레이트 그래프에 포함되지 않습니다.
-D, --deny 린트 거부 설정
--feature-depth 포함 그래프에 기능 에지가 추가되는 깊이 지정
-g, --graph 그래프 출력 루트 디렉토리 경로
설정된 경우, 동일한 크레이트의 여러 버전이 감지될 때마다 dotviz 그래프가 생성됩니다.
--hide-inclusion-graph 크레이트 정보를 출력할 때 포함 그래프 숨기기
기본적으로 진단 메시지가 특정 크레이트와 관련이 있는 경우, cargo-deny는 그 크레이트가 프로젝트에 어떻게 포함되었는지 보여주기 위해 진단에 역 의존성 그래프를 추가합니다.
일부 진단 메시지
the-crate
├── a-crate
└── b-crate
└── c-crate
-s, --show-stats 로그 수준에 관계없이 모든 체크에 대한 통계 표시
-W, --warn 린트 경고 설정
FAQ
패키지의 모든 라이센스 허용
- 질문 하나: 크레이트에 대한 유효한 라이센스 표현을 검색할 수 없습니다. 오류 정보:
error[L003]: ring = 0.16.20 라이센스 없음
┌─ ring 0.16.20 (registry+https://github.com/rust-lang/crates.io-index):2:9
│
2 │ name = "ring"
│ ^^^^ 크레이트에 대한 유효한 라이센스 표현을 검색할 수 없습니다
3 │ version = "0.16.20"
4 │ license = ""
│ - 라이센스 표현이 지정되지 않았습니다
5 │ license-files = [
6 │ { path = "LICENSE", hash = 0xbd0eed23, score = 0.67, license = "OpenSSL" },
해결 방법은? deny.toml 파일에 다음 정보를 추가합니다:
[[licenses.clarify]]
name = "ring"
# SPDX는 OpenSSL이 OpenSSL 및 SSLeay 라이센스를 모두 포함한다고 간주합니다
# https://spdx.org/licenses/OpenSSL.html
# ISC - BoringSSL과 ring 모두 이를 새 파일에 사용합니다
# MIT - "third_party/ 에 있는 파일은 각자의 라이센스가 있습니다. third_party/fiat의 MIT
# 라이센스는 다른 third_party 디렉토리와 달리
# 테스트가 아닌 라이브러리에 컴파일되어 아래에 포함되어 있습니다."
# OpenSSL - 분명히
expression = "ISC AND MIT AND OpenSSL"
license-files = [{ path = "LICENSE", hash = 0xbd0eed23 }]