소스를 빌드하고 패키징하기위한 꿀꺽 꿀꺽 작업이 포함 된 프로젝트가 있으며 dist
. 내 목표는 npm 패키지로 게시하지만 내 dist 폴더 만 게시하는 것입니다. NPM 문서는 내가 사용할 수 있다고 말한다 files
수출에 파일을 지정하는 태그를. 효과가있다. 그러나 문서는 다음과 같이 말합니다.
어레이의 폴더 이름을 지정하면 해당 폴더 내의 파일도 포함됩니다.
결과는 npm 패키지로, node_modules는 다음과 같습니다.
그러나 패키지의 루트 (해당 dist
폴더 제외) 에있는 모든 파일을보고 싶습니다 . 내 index.js
파일은 dist
폴더 안에 있지만 루트에 있어야합니다. 나는 세트 태그 해봤 files
로 /dist/**/*
했지만 작동하지 않았다.
어떻게 할 수 있습니까?
답변
저도 같은 욕망을 가지고 있지만 npm 툴링만으로는 이것을 달성 할 방법이 없다고 생각 합니다. 다른 스크립트 / 도구를 사용하여 패키지를 정렬 할 수 있습니다.
대체 솔루션
현재 내를 복사하고 package.json
에 dist
폴더 다음 실행 npm pack
내부 dist
폴더에 있습니다. 나는 이것이 본질적으로 우리 패키지의 원하는 배열을 제공한다고 생각합니다.
다음은이 npm 디자인에 대한 몇 가지 관련 자료입니다. Why no Directories.lib in Node .
jspm 이 npm 패키지를 해결할 때 파일을 재정렬하고 directories.lib
옵션을 존중한다는 점도 흥미 롭습니다 package.json
. jspm 또는 npm / webpack에서 사용할 수있는 공용 라이브러리를 구축하고 싶기 때문에이 모든 것이 저에게 왔습니다.
답변
원본 포스터 (@robsonrosa)와 비슷한 문제가 있습니다. 제 경우에는 dist
디렉토리로 컴파일되는 typecript를 사용합니다 . typescript를 루트 디렉터리로 컴파일 할 수 있지만 가장 좋은 해결책은 package.json
dist 디렉터리에 별도의 파일 을 생성하는 것 입니다.
이것은 복사에 대한 @scvnc 제안과 유사 package.json
하지만 비틀기가 있습니다.
패키징 프로세스의 일부로 루트 디렉토리 package.json
의 기본 package.json
파일을 기반으로하지만 구별되는 패키지 용을 생성해야합니다.
근거:
- 루트
package.json
파일은 개발 파일입니다. 패키지 사용자에게 사용되지 않는 스크립트 또는 개발 종속성이 포함될 수 있지만 보안 문제가 발생할 수 있습니다. 포장 절차에는 제품에서 해당 정보를 제거하는 코드가 포함될 수 있습니다package.json
. - 다른 패키지 파일이 필요할 수있는 다른 환경에 패키지를 배포 할 수 있습니다 (예 : 다른 버전 또는 종속성을 가질 수 있음).
— 편집하다 —
댓글에서 해결책을 요청 받았습니다. 그래서 여기에 제가 사용하고있는 코드가 있습니다. 이것은 일반적인 것을 의미하지 않으며 내 프로젝트에 특정한 예로 간주되어야합니다.
내 설정 :
package.json - main package.json with dev dependencies and useful scripts.
.npmignore - files to ignore; copied to 'dist' directory as part of the setup.
/src - directory where my typescript code resides.
/src/SetupPackage.ts - bit of code used to setup the package.
/dist - destination directory for the compiled javascript files.
dist
디렉터리 만 패키징 하고 디렉터리는 패키지의 루트 디렉터리 여야합니다.
파일 SetupPackage.ts
내에서 src
디렉토리에 컴파일됩니다 SetupPackage.js
에 dist
타이프 라이터로 디렉토리 :
import fs from "fs";
// DO NOT DELETE THIS FILE
// This file is used by build system to build a clean npm package with the compiled js files in the root of the package.
// It will not be included in the npm package.
function main() {
const source = fs.readFileSync(__dirname + "/../package.json").toString('utf-8');
const sourceObj = JSON.parse(source);
sourceObj.scripts = {};
sourceObj.devDependencies = {};
if (sourceObj.main.startsWith("dist/")) {
sourceObj.main = sourceObj.main.slice(5);
}
fs.writeFileSync(__dirname + "/package.json", Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8") );
fs.writeFileSync(__dirname + "/version.txt", Buffer.from(sourceObj.version, "utf-8") );
fs.copyFileSync(__dirname + "/../.npmignore", __dirname + "/.npmignore");
}
main();
이 파일:
- 루트를 복사
package.json
하지만 패키지에 필요하지 않은 스크립트 및 개발 종속성을 제거합니다. 또한 패키지에 대한 기본 진입 점을 수정합니다. - 에서 패키지 버전을
package.json
라는 파일에 씁니다version.txt
. .npmignore
루트 에서 패키지를 복사합니다 .
.npmignore 콘텐츠는 다음과 같습니다.
*.map
*.spec.*
SetupPackage.*
version.txt
즉 단위 테스트 (사양 파일) 및 typescript 맵 파일은 물론 생성 된 SetupPackage.js
파일과 파일도 무시됩니다 version.txt
. 이것은 깨끗한 패키지를 남깁니다.
마지막으로 주 package.json
파일에는 빌드 시스템에서 사용할 수있는 다음 스크립트가 있습니다 ( sh
셸로 사용되는 것으로 가정 ).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
패키지를 빌드하기 위해 빌드 시스템은 리포지토리를 복제 npm install
한 다음 실행 npm run buildpackage
합니다.
dist
깨끗한 컴파일을 보장하는 디렉토리를 삭제합니다 .- typescript 코드를 javascript로 컴파일합니다.
- 패키징
SetupPackage.js
을 준비 하는 파일을 실행합니다dist
. - 받는 CD의
dist
디렉토리와 패키지를 빌드있다.
version.txt
package.json에서 버전을 가져오고 내 저장소에 태그를 지정하는 쉬운 방법으로 파일을 사용합니다 . 이를 수행하는 수많은 다른 방법이 있거나 버전을 자동으로 증가시킬 수 있습니다. 에서이를 제거 SetupPackage.ts
하고 .npmignore
당신에게 도움이되지 않습니다.
답변
프로젝트에 git이 있으면 작은 해킹을 사용할 수 있습니다. package.json에 다음 스크립트 추가
"prepublishOnly": "npm run build && cp -r ./lib/* . && rm -rf ./lib",
"postpublish": "git clean -fd",
이제 publish
npm involve 명령 을 실행할 때 prepublishOnly
. 파일을 빌드하고 lib
폴더에 저장 합니다 (빌드 스크립트는 프로젝트에 따라 다름). 다음 명령은 파일을 루트 폴더에 복사하고 lib
. 게시 후 postpublish
스크립트는 프로젝트를 이전 상태로 되돌립니다.
답변
.npmignore
특히 배포를 위해 CI를 사용하는 경우 이동하거나 복사 하는 대신 사용하고 게시하지 않으려는 파일을 추가하는 것이 좋습니다.
https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
예:
#tests
test
coverage
#build tools
.travis.yml
.jenkins.yml
.codeclimate.yml
#linters
.jscsrc
.jshintrc
.eslintrc*
#editor settings
.idea
.editorconfig
최신 정보:
코드를 동일한 리포지토리를 사용하여 다른 npm 패키지로 나누고 싶다면 최근에이 프로젝트에 부딪 혔습니다. Lerna 는 정말 좋아 보입니다.
아마도 당신은 한 번 봐
답변
이것은 나를 위해 잘 작동합니다.
cd TMPDIR; npm pack
/path/to/package.json
Tarball은 TMPDIR 디렉터리 내에 생성됩니다.
답변
semantic-release를 사용하는 경우 (권장하는 경우) 파일에 pkgRoot
옵션을 추가 .releaserc.json
하십시오.
{
"pkgRoot": "dist",
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/npm",
[
"@semantic-release/exec",
{
"prepareCmd": "npx rjp package.json version nextRelease.version"
}
],
[
"@semantic-release/git",
{
"assets": ["package.json"]
}
],
],
}
그것은 문제를 처리 할 것입니다. dist
폴더에 package.json
파일이 있는지 확인하십시오 . 당신은 쉽게 추가하여 해당 작업을 수행 할 수 있습니다 cp
당신에 postbuild
스크립트. rjp 도 설치 하십시오.
답변
dist
폴더 를 게시해야 합니다.
이를 달성하는 자연스러운 방법은 npm 접근 방식에 따라 루트가 될 폴더를 게시하는 것입니다. 작업하려는 최종 환경에 따라 여러 가지 방법이 있습니다.
- npm 은 패키지 저장소에서 npm 레지스트리로 <folder> 를 게시 한 다음 다른 패키지를 설치할 때 다른 프로젝트에 패키지를 설치합니다. 귀하의 경우에는
npm publish dist
. - 패키지를 로컬로만 사용하려는 경우 npm 은 다른 프로젝트에 <folder> 를 설치 합니다. 귀하의 경우에는 다른 프로젝트로 이동하여
npm install relative/path/to/dist
- npm
node_modules
은 원래 패키지의 변경 사항을 다른 프로젝트에 즉시 반영하려는 경우 폴더 를 다른 프로젝트의 로컬에 연결 합니다 . 귀하의 경우에는 먼저cd dist
실행npm link
한 다음 다른 프로젝트로 이동하여npm link robsonrosa-ui-alert
.
전제 조건 : 위의 모든 경우에 게시 / 설치 / 링크 전에 dist
최소한 적절한 package.json
파일을 폴더에 넣어야 합니다. 귀하의 경우에는 package.json 파일에 패키지 이름을 "name": "robsonrosa-ui-alert"
. 일반적으로 README.md 또는 LICENSE와 같은 다른 파일도 필요합니다.
방법 2 및 3에 대한 설명
일반적으로 이러한 방식으로 설치된 패키지를 사용할 때 패키지 종속성에 문제가 있습니다. 이를 방지하려면 먼저 패키지를 패키지로 묶은 npm pack dist
다음 패키지 된 tarball, 즉 npm install path/to/package-tarball.tgz
.
자동화 예
prepare
스크립트 와 결합 된 스크립트를 사용하여 게시 프로세스를 자동화 할 수 있습니다 build
. 또한 "private": true
패키지 저장소의 루트 디렉토리에있는 package.json에 필드 가있는 패키지 루트 폴더가 실수로 게시되지 않도록 패키지를 보호 할 수 있습니다 . 예를 들면 다음과 같습니다.
"private": true,
"scripts": {
"build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json",
"prepare": "npm run build"
},
이렇게하면 루트 폴더를 게시하지 않고 게시 dist
프로세스 내에서 패키지가 빌드되고 package.json이 폴더에 자동으로 복사됩니다 .