ฉันมีปัญหาคล้ายกับโปสเตอร์ต้นฉบับ (@robsonrosa) ในกรณีของฉันฉันใช้ typecript ซึ่งรวบรวมไปยังdist
ไดเร็กทอรี ในขณะที่ฉันสามารถสร้าง 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
ไดเร็กทอรีโดย typescript:
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
แต่ลบสคริปต์และการอ้างอิง dev ซึ่งไม่จำเป็นในแพ็กเกจ นอกจากนี้ยังแก้ไขจุดเข้าหลักไปยังแพ็กเกจ
- เขียนรุ่นของแพคเกจจากไปยังไฟล์ที่เรียกว่า
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"
},
ในการสร้างแพ็กเกจระบบบิลด์จะโคลน repo ทำnpm install
แล้วรันnpm run buildpackage
ซึ่งจะ:
- ลบ
dist
ไดเร็กทอรีเพื่อให้แน่ใจว่าคอมไพล์สะอาด
- คอมไพล์โค้ด typescript ไปยัง javascript
- เรียกใช้
SetupPackage.js
ไฟล์ที่เตรียมdist
บรรจุภัณฑ์
- ซีดีไปยัง
dist
ไดเร็กทอรีและสร้างแพ็คเกจที่นั่น
ฉันใช้version.txt
ไฟล์เป็นวิธีง่ายๆในการรับเวอร์ชันใน package.json และติดแท็ก repo ของฉัน มีวิธีอื่นอีกมากมายในการทำเช่นนี้หรือคุณอาจต้องการเพิ่มเวอร์ชันอัตโนมัติ ลบสิ่งนี้ออกจากSetupPackage.ts
และ.npmignore
หากไม่มีประโยชน์กับคุณ