我有与原始海报(@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
目录中:
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
用作外壳程序)。
"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
目录以确保干净编译。
- 将打字稿代码编译为javascript。
- 执行
SetupPackage.js
准备dist
打包的文件。
- cds到
dist
目录并在其中构建软件包。
我使用该version.txt
文件作为在package.json中获取版本并标记存储库的简便方法。有许多其他方法可以执行此操作,或者您可能想自动增加版本。从删除此SetupPackage.ts
而.npmignore
如果不是对你有用。