我有与原始海报 (@robsonrosa) 类似的问题。在我的例子中,我使用编译到 dist 目录的 typecript。虽然我可以将 typescript 编译到根目录,但我认为最好的解决方案是在 dist 目录中生成一个单独的 package.json 文件。
这类似于复制package.json 的@scvnc 建议,但有一点不同:
作为打包过程的一部分,您应该为包生成一个 package.json,它基于但不同于根目录中的主 package.json 文件
理由:
- 根
package.json 文件是开发文件。它可能包含对包用户无用的脚本或开发依赖项,但可能会给您带来安全问题。您的打包过程可能包含从生产package.json 中删除该信息的代码。
- 您可能希望将包部署到可能需要不同包文件的不同环境(例如,您可能希望拥有不同的版本或依赖项)。
--- 编辑 ---
我被要求在 cmets 中寻求解决方案。所以这是我正在使用的一些代码。这应该被视为一个示例,它并不是通用的,而是特定于我的项目的。
我的设置:
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目录,该目录应该是包中的根目录。
我的src目录下的文件SetupPackage.ts会被typescript编译成dist目录下的SetupPackage.js:
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
即单元测试(规范文件)和打字稿映射文件以及它创建的SetupPackage.js 文件和version.txt 文件被忽略。这留下了一个干净的包。
最后,package.json 主文件包含以下脚本供构建系统使用(假设 sh 用作 shell)。
"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。
- 执行准备
dist 进行打包的SetupPackage.js 文件。
- cds 到
dist 目录并在那里构建包。
我使用 version.txt 文件作为获取 package.json 中的版本并标记我的 repo 的简单方法。有无数其他方法可以做到这一点,或者您可能希望自动增加版本。如果对您没有用,请将其从 SetupPackage.ts 和 .npmignore 中删除。