Tôi gặp sự cố tương tự với người đăng ban đầu (@robsonrosa). Trong trường hợp của tôi, tôi sử dụng typecript để biên dịch thành một dist
thư mục. Trong khi tôi có thể biên dịch typecript vào thư mục gốc, tôi nghĩ giải pháp tốt nhất là tạo một package.json
tệp riêng trong thư mục dist.
Điều này tương tự như @scvnc đề xuất sao chép package.json
nhưng có sự thay đổi:
Là một phần của quá trình đóng gói, bạn nên tạo một package.json
gói dựa trên nhưng khác với package.json
tệp chính trong thư mục gốc
Cơ sở lý luận:
- Gốc
package.json
là tệp phát triển. Nó có thể chứa các tập lệnh hoặc phần phụ thuộc phát triển không có ích cho người dùng gói, nhưng có thể gây ra các lo ngại về bảo mật cho bạn. Quy trình đóng gói của bạn có thể bao gồm mã tách thông tin đó khỏi quá trình sản xuất package.json
.
- Bạn có thể muốn triển khai gói của mình đến các môi trường khác nhau có thể yêu cầu các tệp gói khác nhau (ví dụ: bạn có thể muốn có các phiên bản hoặc phụ thuộc khác nhau).
--- BIÊN TẬP ---
Tôi đã được yêu cầu một giải pháp trong các ý kiến. Vì vậy, đây là một số mã tôi đang sử dụng. Đây nên được coi là một ví dụ, nó không có nghĩa là chung chung và cụ thể cho các dự án của tôi.
Thiết lập của tôi:
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.
Tôi chỉ muốn đóng gói dist
thư mục và thư mục phải là thư mục gốc trong gói.
Tệp SetupPackage.ts
trong src
thư mục của tôi sẽ được biên dịch SetupPackage.js
trong dist
thư mục bằng typecript:
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();
Tệp này:
- Sao chép thư mục gốc
package.json
nhưng loại bỏ các tập lệnh và phần phụ thuộc nhà phát triển không cần thiết trong gói. Nó cũng sửa điểm vào chính của gói.
- Ghi phiên bản của gói từ
package.json
một tệp được gọi version.txt
.
- Sao chép
.npmignore
gói từ gốc.
Nội dung .npmignore là:
*.map
*.spec.*
SetupPackage.*
version.txt
Tức là các bài kiểm tra đơn vị (tệp đặc tả) và tệp bản đồ sắp chữ bị bỏ qua cũng như SetupPackage.js
tệp và version.txt
tệp mà nó tạo ra. Điều này để lại một gói sạch.
Cuối cùng, package.json
tệp chính có các tập lệnh sau để hệ thống xây dựng sử dụng (giả sh
sử được sử dụng làm trình bao).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
Để xây dựng gói, hệ thống xây dựng sao chép repo, npm install
và sau đó lần lượt chạy npm run buildpackage
:
- Xóa
dist
thư mục đảm bảo một biên dịch sạch.
- Biên dịch mã typecript thành javascript.
- Thực thi
SetupPackage.js
tệp chuẩn bịdist
đóng gói.
- cds vào
dist
thư mục và xây dựng gói ở đó.
Tôi sử dụng version.txt
tệp như một cách dễ dàng để lấy phiên bản trong package.json và gắn thẻ repo của tôi. Có vô số cách khác để làm điều này hoặc bạn có thể muốn tự động tăng phiên bản. Loại bỏ điều này khỏi SetupPackage.ts
và .npmignore
nếu nó không hữu ích cho bạn.