2탄에 이은 3탄에서는 비교적 실무에서도 많이 쓰는 것들인것같아서 따로 뽑아보았다.
전부 다 많이 쓰는 것은 아니지만 공식문서의 순서대로 나열하고 비슷한것들은 한편에 묶다보니 상당히 내용이 길어 질것같다,,,
https://docs.npmjs.com/cli/v8/configuring-npm/package-json npm 공식문서를 읽으며 번역하여 기록해두기로 한다.
repository
repository
Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the npm docs command will be able to find you.
Do it like this:
{
"repository": {
"type": "git",
"url": "https://github.com/npm/cli.git"
}
}
The URL should be a publicly available (perhaps read-only) url that can be handed directly to a VCS program without any modification. It should not be a url to an html project page that you put in your browser. It's for computers.
For GitHub, GitHub gist, Bitbucket, or GitLab repositories you can use the same shortcut syntax you use for npm install:
{
"repository": "npm/npm",
"repository": "github:user/repo",
"repository": "gist:11081aaa281",
"repository": "bitbucket:user/repo",
"repository": "gitlab:user/repo"
}
If the package.json for your package is not in the root directory (for example if it is part of a monorepo), you can specify the directory in which it lives:
{
"repository": {
"type": "git",
"url": "https://github.com/facebook/react.git",
"directory": "packages/react-dom"
}
}
저장소
당신의 코드가 관리되는 저장소의 위치를 지정한다. 기여하고자 하는 사람들에게 도움이 될 것이다. 만약 git 레포가 github라면 npm docs 명령으로 찾을 수 있다.
이 처럼 시도해 보아라:
{
"repository": {
"type": "git",
"url": "https://github.com/npm/cli.git"
}
}
URL은 특별한 수정 없이 VCS 프로그램에 직접 전달될 수 있는 공개적으로 사용하여야 한다. 프로젝트 페이지의 URL이 아니여야 하며, 컴퓨터를 위한 부분이다.
GiyHub, GitHub gist, Bitbucket 또는 GitLab 레포지토리의 경우 npm 설치에 사용하는 것과 동일한 바로가기 구문을 사용할수 있다.
{
"repository": "npm/npm",
"repository": "github:user/repo",
"repository": "gist:11081aaa281",
"repository": "bitbucket:user/repo",
"repository": "gitlab:user/repo"
}
패키지의 package.json이 루트 디렉터리에 없는 경우 패키지가 있는 디렉터리를 지정할 수 있다.
{
"repository": {
"type": "git",
"url": "https://github.com/facebook/react.git",
"directory": "packages/react-dom"
}
}
scripts
scripts
The "scripts" property is a dictionary containing script commands that are run at various times in the lifecycle of your package. The key is the lifecycle event, and the value is the command to run at that point.
See scripts to find out more about writing package scripts.
스크립트
"scripts" 항목은 패키지의 수명 주기에서 다양한 시간에 실행되는 스크립트 명령을 포함하는 사전이다. 키는 수명주기 이벤트이고 값은 해당 지점에서 실행할 명령이다.
패키지 스크립트 작성에 대한 자세한 내용은 스크립트(https://docs.npmjs.com/cli/v9/using-npm/scripts)를 참조한다.
(ps. 제일 중요한 부분인데 그래서 그런지 공식문서에서도 따로 빼놨네요. package.json 시리즈 다 작성후 스크립트에 대한 내용도 작성해 보겠습니다.)
config
config
A "config" object can be used to set configuration parameters used in package scripts that persist across upgrades. For instance, if a package had the following:
{
"name": "foo",
"config": {
"port": "8080"
}
}
It could also have a "start" command that referenced the npm_package_config_port environment variable.
config
"config" 객체는 패키지의 버전에 관계없이 패키지 스크립트에서 사용될 수 있는 설정 정보이다. 예를 들어, 패키지에 다음이 포함된 경우:
{
"name": "foo",
"config": {
"port": "8080"
}
}
또한 npm_package_config_port 환경 변수를 참조하는 "시작" 명령이 있을 수 있다.
dependencies
dependencies
Dependencies are specified in a simple object that maps a package name to a version range. The version range is a string which has one or more space-separated descriptors. Dependencies can also be identified with a tarball or git URL.
Please do not put test harnesses or transpilers or other "development" time tools in your dependencies object. See devDependencies, below.
See semver for more details about specifying version ranges.
- version Must match version exactly
- >version Must be greater than version
- >=version etc
- <version
- <=version
- ~version "Approximately equivalent to version" See semver
- ^version "Compatible with version" See semver
- 1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
- http://... See 'URLs as Dependencies' below
- * Matches any version
- "" (just an empty string) Same as *
- version1 - version2 Same as >=version1 <=version2.
- range1 || range2 Passes if either range1 or range2 are satisfied.
- git... See 'Git URLs as Dependencies' below
- user/repo See 'GitHub URLs' below
- tag A specific version tagged and published as tag See npm dist-tag
- path/path/path See Local Paths below
For example, these are all valid:
{
"dependencies": {
"foo": "1.0.0 - 2.9999.9999",
"bar": ">=1.0.2 <2.1.2",
"baz": ">1.0.2 <=2.3.4",
"boo": "2.0.1",
"qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"asd": "http://asdf.com/asdf.tar.gz",
"til": "~1.2",
"elf": "~1.2.3",
"two": "2.x",
"thr": "3.3.x",
"lat": "latest",
"dyl": "file:../dyl"
}
}
dependencies
의존성은 패키지 이름을 버전 범위에 매핑하는 간단한 개체에 지정된다. 버전 범위는 하나 이상의 공백으로 구분된 설명자가 있는 문자열이다. 의존성은 tarball 이나 git URL로 식별 할 수도 있다.
테스트 관련 모듈이나 트랜스 파일러 관련 모듈을 dependencies 개체에 추가하면 안된다. devDependencies를 참조하여라.
버전 범위 지정에 대한 자세한 내용은 semver를 참조하여라
- version: 버전과 정확히 일치해야 함
- >version: 버전보다 커야한다.
- >=version: 기타
- <version
- <=version
- ~version: "명시한 version과 근사한 버전." semver 참조
- ^version: "명시한 version과 호환되는 것" semver 참조
- 1.2.x 1.2.0, 1.2.1, 등., 1.3.0은 제회
- http://... : 아래의 URLs as Dependencies 항목 참조.
- *: 모든 버전
- "": *와 같음
- version1 - version2: >= version1 <= version2.
- range1 || range2: range1 또는 range2
- git...: 하단의 Git URLs as Dependencies 항목 참조.
- user/repo: 하단의 Github URLs 항목 참조
- tag: tag가 지정되어 publish 된 특정 버전. 자세한 내용은 npm-tag 항목 참조.
- path/path/path: 하단의 Local Paths 항목 참조.
{
"dependencies": {
"foo": "1.0.0 - 2.9999.9999",
"bar": ">=1.0.2 <2.1.2",
"baz": ">1.0.2 <=2.3.4",
"boo": "2.0.1",
"qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"asd": "http://asdf.com/asdf.tar.gz",
"til": "~1.2",
"elf": "~1.2.3",
"two": "2.x",
"thr": "3.3.x",
"lat": "latest",
"dyl": "file:../dyl"
}
}
URLs as Dependencies
URLs as Dependencies
You may specify a tarball URL in place of a version range.
This tarball will be downloaded and installed locally to your package at install time.
URLs as Dependencies
버전 범위 대신 tarball URL을 지정할 수 있다.
이 tarball은 설치 시 패키지에 로컬로 다운로드 및 설치된다.
Git URLs as Dependencies
Git URLs as Dependencies
Git urls are of the form:
<protocol> is one of git, git+ssh, git+http, git+https, or git+file.
If #<commit-ish> is provided, it will be used to clone exactly that commit. If the commit-ish has the format #semver:<semver>, <semver> can be any valid semver range or exact version, and npm will look for any tags or refs matching that range in the remote repository, much as it would for a registry dependency. If neither #<commit-ish> or #semver:<semver> is specified, then the default branch is used.
Examples:
git+ssh://git@github.com:npm/cli.git#v1.0.27
git+ssh://git@github.com:npm/cli#semver:^5.0
git+https://isaacs@github.com/npm/cli.git
git://github.com/npm/cli.git#v1.0.27
When installing from a git repository, the presence of certain fields in the package.json will cause npm to believe it needs to perform a build. To do so your repository will be cloned into a temporary directory, all of its deps installed, relevant scripts run, and the resulting directory packed and installed.
This flow will occur if your git dependency uses workspaces, or if any of the following scripts are present:
- build
- prepare
- prepack
- preinstall
- install
- postinstall
If your git repository includes pre-built artifacts, you will likely want to make sure that none of the above scripts are defined, or your dependency will be rebuilt for every installation.
Git URLs as Dependencies
Git URL의 형식은 다음과 같다.
<protocol> is one of git, git+ssh, git+http, git+https, or git+file.
#<commit-ish>가 제공되면 정확히 해당 커밋을 복제하는데 사용된다. commit-ish 형식이 #semver:<semver>인 경우 <semver>는 유효한 semver 범위 또는 정확한 버전일 수 있고, npm은 레지스트리 의존성과 마찬가지로 원격 저장소에서 해당 범위와 일치하는 태그 또는 참조를 찾는다. #<commit-ish> 또는 #semver:<semver>를 지정하지 않으면 기본 분기가 사용된다.
예시:
git+ssh://git@github.com:npm/cli.git#v1.0.27
git+ssh://git@github.com:npm/cli#semver:^5.0
git+https://isaacs@github.com/npm/cli.git
git://github.com/npm/cli.git#v1.0.27
git 레포지토리에서 설치할 때 package.json에 특정 필드가 있으면 npm이 빌드를 수행해야 한다. 이를 위해 레포지토리가 임시 디렉터리에 복제되고 해당 deps가 모두 설치되고 관련 스크립트가 실행되며 결과 디렉터리가 압축 및 설치된다.
이 흐름은 git 의존성이 작업 공간을 사용하거나 다음 스크립트 중 하나가 있는 경우 발생한다.
- build
- prepare
- prepack
- preinstall
- install
- postinstall
git 레포지토리에 미리 빌드된 아티팩트가 포함되어 있는 경우 위의 스크립트 중 어느 것도 정의되지 않았는지 확인하고 싶을 것이다. 그렇지 않으면 모든 설치에 대해 의성이 다시 빌드된다.
GitHub URLs
GitHub URLs
As of version 1.1.65, you can refer to GitHub urls as just "foo": "user/foo-project". Just as with git URLs, a commit-ish suffix can be included. For example:
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
"express": "expressjs/express",
"mocha": "mochajs/mocha#4727d357ea",
"module": "user/repo#feature\/branch"
}
}
GitHub URLs
버전 1.1.65부터는 GitHub URL을 "foo": "user/foo-project"로 참조할 수 있다. git URL과 마찬가지로 commit-ish 접미사를 포함할 수 있다.
{
"name": "foo",
"version": "0.0.0",
"dependencies": {
"express": "expressjs/express",
"mocha": "mochajs/mocha#4727d357ea",
"module": "user/repo#feature\/branch"
}
}
Local Paths
Local Paths
As of version 2.0.0 you can provide a path to a local directory that contains a package. Local paths can be saved using npm install -S or npm install --save, using any of these forms:
../foo/bar
~/foo/bar
./foo/bar
/foo/bar
in which case they will be normalized to a relative path and added to your package.json. For example:
{
"name": "baz",
"dependencies": {
"bar": "file:../foo/bar"
}
}
This feature is helpful for local offline development and creating tests that require npm installing where you don't want to hit an external server, but should not be used when publishing packages to the public registry.
note: Packages linked by local path will not have their own dependencies installed when npm install is ran in this case. You must run npm install from inside the local path itself.
Local Paths
버전 2.0.0부터는 패키지가 포함된 로컬 디렉토리의 경로를 제공할 수 있다. 로컬 경로는 다음 형식중 하나를 사용하여 npm i -S 또는 npm i --save를 사용하여 저장할 수 있다.
../foo/bar
~/foo/bar
./foo/bar
/foo/bar
{
"name": "baz",
"dependencies": {
"bar": "file:../foo/bar"
}
}
이 기능은 로컬 오프라인 개발 및 외부 서버에 도달하지 않으려는 npm 설치가 필요한 테스트 생성에 유용하지만 공용 레지스트리에 패키지를 게시할 때 사용해서는 안된다.
참고: 이 경우 로컬 경로로 연결된 패키지에는 npm install이 실행될 때 자체 의성이 설치되지 않는다. 로컬 경로 자체에서 npm install을 실행해야 한다.
devDependencies
devDependencies
누군가 자신의 프로그램에서 모듈을 다운로드하고 사용할 계획이라면 그들은 아마도 당신이 사용하는 외부 테스트 또는 문서 프레임 워크를 다운로드하고 빌드할 필요가 없거나 원하지 않을 것이다.
이 경우 이러한 추가항목을 devDependencies 객체에 매핑하는 것이 가장 좋다.
이러한 것들은 패키지의 루트에서 npm 링크 또는 npm 링크 또는 npm 설치를 수행할 때 설치되며 다른 npm 구성 매개변수처럼 관리할 수 있다. 주제에 대한 자세한 내용은 구정을 참조한다.
CoffeeScript 또는 기타 언어를 JavaScript로 컴파일하는 것과 같이 플랫폼에 따라 다르지 않은 빌드 단계의 경우 prepublish 스크립트를 사용하여 이를 수행하고 필요한 패키지를 devDependency로 만들어라.
예시:
{
"name": "ethopia-waza",
"description": "a delightfully fruity coffee varietal",
"version": "1.2.3",
"devDependencies": {
"coffee-script": "~1.6.3"
},
"scripts": {
"prepare": "coffee -o lib/ -c src/waza.coffee"
},
"main": "lib/waza.js"
}
prepublish 스크립트는 게시전에 실행되므로 사용자가 직접 컴파일하지 않고도 기능을 사용할 수 있다. 개발모드(로컬에서 npm i 실행)에서는 이 스크립트도 실행하므로 쉽게 테스트할 수 있다.
peerDependencies
peerDependencies
In some cases, you want to express the compatibility of your package with a host tool or library, while not necessarily doing a require of this host. This is usually referred to as a plugin. Notably, your module may be exposing a specific interface, expected and specified by the host documentation.
For example:
{
"name": "tea-latte",
"version": "1.3.5",
"peerDependencies": {
"tea": "2.x"
}
}
This ensures your package tea-latte can be installed along with the second major version of the host package tea only. npm install tea-latte could possibly yield the following dependency graph:
├── tea-latte@1.3.5
└── tea@2.2.0
In npm versions 3 through 6, peerDependencies were not automatically installed, and would raise a warning if an invalid version of the peer dependency was found in the tree. As of npm v7, peerDependencies are installed by default.
Trying to install another plugin with a conflicting requirement may cause an error if the tree cannot be resolved correctly. For this reason, make sure your plugin requirement is as broad as possible, and not to lock it down to specific patch versions.
Assuming the host complies with semver, only changes in the host package's major version will break your plugin. Thus, if you've worked with every 1.x version of the host package, use "^1.0" or "1.x" to express this. If you depend on features introduced in 1.5.2, use "^1.5.2".
peerDependencies
경우에 따라 패키지와 호스트 도구 또는 라이브러리의 호환성을 표한하고 싶지만 반드시 이 호스트를 요구하지는 않는다. 일반적으로 플러그인이라고 한다. 특히 모듈이 호스트 문서에서 예상하고 지정한 특정 인터페이스를 노출할수 있다.
예시:
{
"name": "tea-latte",
"version": "1.3.5",
"peerDependencies": {
"tea": "2.x"
}
}
이렇게 하면 패키지 tea-latte가 호스트 패키지인 tea only의 두번째 주요 버전과 함께 설치될 수 있다. npm install tea-latte는 다음 의성 그래프를 생성할 수 있다.
├── tea-latte@1.3.5
└── tea@2.2.0
npm 버전 3~6에서는 peerDependencies가 자동으로 설치되지 않았으며 트리에서 피어 의성의 잘못된 버전이 발견되면 경고가 발생했다. npm v7부터 peerDependencies가 기본적으로 설치된다.
요구 사항이 충돌하는 다른 플러그인을 설치하려고 하면 트리를 올바르게 확인할 수 없는 경우 오류가 발생할 수 있다. 이러한 이유로 플러그인 요구 사항이 가능한한 광범위하고 특정 패치버전으로 제한되지 않도록 해야 한다.
호스트가 semver를 준수한다고 가정하면 호스트 패키지의 주 버전에서만 변경하면 플러그인이 중단된다 ㅏ라서호스트 패키지의 모든 1.x 버전으로 작업했다면 "^1.0" 또는 "1.X"를 사용하여 이를 표한한다. 1.5.2에 도입된 기능에 의존하는 경우 "^1.5.2"를 사용하여라.
peerDependenciesMeta
peerDependenciesMeta
When a user installs your package, npm will emit warnings if packages specified in peerDependencies are not already installed. The peerDependenciesMeta field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer dependencies to be marked as optional.
For example:
{
"name": "tea-latte",
"version": "1.3.5",
"peerDependencies": {
"tea": "2.x",
"soy-milk": "1.2"
},
"peerDependenciesMeta": {
"soy-milk": {
"optional": true
}
}
}
Marking a peer dependency as optional ensures npm will not emit a warning if the soy-milk package is not installed on the host. This allows you to integrate and interact with a variety of host packages without requiring all of them to be installed.
peerDependenciesMeta
사용자가 패키지를 설치할 때 peerDependencies에 지정된 패키지가 아직 설치되지 않은 경우 npm에서 경고를 표시한다. peerDependenciesMeta 필드는 피어 의존성이 사용되는 방법에 대한 npm 추가 정보를 제공한다. 특히, peer dependencies 선택사항으로 표시할 수 있다.
예시시:
{
"name": "tea-latte",
"version": "1.3.5",
"peerDependencies": {
"tea": "2.x",
"soy-milk": "1.2"
},
"peerDependenciesMeta": {
"soy-milk": {
"optional": true
}
}
}
peer dependency를 선택사항으로 표시하면 두개의 유효한 ㅐ키지가 호스트에 설치되지 않은 경우 npm이 경고를 표시하지 않는다. 이를 통해 모든 호스트 패키지를 설치하지 않고도 다양한 호스트 패키지를 통합하고 상호작용 할 수 있다.
bundleDependencies
bundleDependencies
이는 패키지를 게시할 때 번들로 묶일 패키지 이름의 배열을 정의한다.
npm 패키지를 로컬로 보존하거나 단일 파일 다운로드를 통해 사용할 수 있어야 하는 경우 bundleDependencies 배열에 패키지 이름을 지정하고 npm pack을 실행하여 패키지를 tarball 파일로 묶을 수 있다.
예시:
다음과 같이 package.json을 정의하면:
{
"name": "awesome-web-framework",
"version": "1.0.0",
"bundleDependencies": [
"renderized",
"super-streams"
]
}
npm pack을 실행하여 awesome-web-framework-1.0.0.tgz 파일을 얻을 수 있다. 이 파일에는 npm install awesome-web-framework-1.0.0.tgz를 실행하여 새 프로젝틍 ㅔ설치할 수 있는 렌더링된 의존성과 슈퍼 스트림이 포함되어 있다. 해당 정보가 의존 항목에 지정되어 있으므로 패키지 이름에는 버전이 포함되지 않는다.
철자가 "bundledDependencies"인 경우에도 적용된다.
또는, "bundleDependencies"를 bool 값으로 정의할 수 있다. true 값은 모든 의존존성을 묶고, false 값은 묶지 않는다.
optionalDependencies
optionalDependencies
If a dependency can be used, but you would like npm to proceed if it cannot be found or fails to install, then you may put it in the optionalDependencies object. This is a map of package name to version or url, just like the dependencies object. The difference is that build failures do not cause installation to fail. Running npm install --omit=optional will prevent these dependencies from being installed.
It is still your program's responsibility to handle the lack of the dependency. For example, something like this:
try {
var foo = require('foo')
var fooVersion = require('foo/package.json').version
} catch (er) {
foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
foo = null
}
// .. then later in your program ..
if (foo) {
foo.doFooThings()
}
Entries in optionalDependencies will override entries of the same name in dependencies, so it's usually best to only put in one place.
optionalDependencies
의존성을 사용할 수 있지만 찾을 수 없거나 설치에 실패한 경우 npm을 진행하려는 경우 optionalDependencies 객체에 넣을수 있다. 의존성 객체와 마찬가지로 버전 또는 URL에 대한 패키지 이름의 맵이다. 차이점은 빌드 실패로 인해 설치가 실패하지 않는다는 것이다. npm install --omit=optional 을 실행하면 이러한 의존성이 설치되지 않는다.
다음과 같이 의존성 모듈이 없는 경우에 대응하도록 개발했을 때 사용하는 것이 좋다.
try {
var foo = require('foo')
var fooVersion = require('foo/package.json').version
} catch (er) {
foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
foo = null
}
// .. then later in your program ..
if (foo) {
foo.doFooThings()
}
optionalDependencies의 항목은 의존 항목에서 동일한 이름의 항목을 재정의하므로 일반적으로 한 곳에만 기재하는 것이 가장 좋다.
'NodeJS > NodeJS' 카테고리의 다른 글
[NodeJS] 공식문서와 함께하는 package.json에 대한 모든 것 4탄 (0) | 2023.02.05 |
---|---|
[NodeJS] 공식문서와 함께하는 package.json에 대한 모든 것 2탄 (0) | 2023.01.17 |
[NodeJS] request모듈의 qs에 Object.assign 사용하여 배열넣기 (0) | 2022.12.19 |
[NodeJS] 공식문서와 함께하는 package.json에 대한 모든 것 1탄 (0) | 2022.11.21 |
[NVM] nvm 설치하기 (0) | 2022.09.22 |