我正在处理一个缺少package.json文件的项目。开发人员推送了package-lock.json文件,但未推送package.json文件。如何从package-lock.json文件创建一个干净的package.json?
v6ylcynt1#
不可能从package-lock.json生成完整的package.json,因为后者不包含所有必要的数据。它只包含特定版本的依赖项列表,而没有原始的semvers。生产和开发依赖沿着嵌套依赖混合在一起。可以生成新的package.json,然后使用这些依赖关系进行扩展,如下所示:
package-lock.json
package.json
const fs = require('fs'); const packageLock = require('./package-lock.json'); const package = require('./package.json'); package.dependencies = Object.entries(packageLock.dependencies) .reduce((deps, [dep, { version }]) => Object.assign(deps, { [dep]: version }), {}); fs.writeFileSync('./package-new.json', JSON.stringify(package, null, 2));
嵌套依赖项可以通过检查requires键来过滤掉,但这会影响项目自身的依赖项。
requires
b0zn9rqh2#
只需运行npm init,如果您已经生成了node_modules/,它将从package-lock.json中提取所有当前依赖项。如果没有,运行npm ci从package-lock.json生成节点模块,然后运行npm init生成package.json文件。
npm init
node_modules/
npm ci
nkhmeac63#
接受答案脚本的略微改进版本。将从包锁中拉出锁定版本。
const fs = require('fs'); const packageLock = require('./package-lock.json'); const package = require('./package.json'); package.dependencies = Object.keys(package.dependencies) .reduce((deps, dep) => Object.assign(deps, { [dep]: packageLock.dependencies[dep].version }), {}); package.devDependencies = Object.keys(package.devDependencies) .reduce((deps, dep) => Object.assign(deps, { [dep]: packageLock.dependencies[dep].version }), {}); fs.writeFileSync('./package-new.json', JSON.stringify(package, null, 2));
kupeojn64#
针对较新版本的NPM的改进版本的略微改进版本:
const fs = require('fs'); const packageLock = require('./package-lock.json'); const package = require('./package.json'); const packageJsonNew = package; // Refactor above code into a function const updateDependencies = (dependencies, newDependencies) => { Object.keys(dependencies).forEach(dep => { try { console.log("✅ node_modules/" + dep + ": " + packageLock.packages["node_modules/" + dep].version); newDependencies[dep] = packageLock.packages["node_modules/" + dep].version; } catch (error) { console.log("❌ node_modules/" + dep + ": " + error); } }); } updateDependencies(package.dependencies, packageJsonNew.dependencies); updateDependencies(package.devDependencies, packageJsonNew.devDependencies); fs.writeFileSync('./package-new.json', JSON.stringify(packageJsonNew, null, 2));
4条答案
按热度按时间v6ylcynt1#
不可能从
package-lock.json
生成完整的package.json
,因为后者不包含所有必要的数据。它只包含特定版本的依赖项列表,而没有原始的semvers。生产和开发依赖沿着嵌套依赖混合在一起。可以生成新的
package.json
,然后使用这些依赖关系进行扩展,如下所示:嵌套依赖项可以通过检查
requires
键来过滤掉,但这会影响项目自身的依赖项。b0zn9rqh2#
只需运行
npm init
,如果您已经生成了node_modules/
,它将从package-lock.json
中提取所有当前依赖项。如果没有,运行npm ci
从package-lock.json
生成节点模块,然后运行npm init
生成package.json
文件。nkhmeac63#
接受答案脚本的略微改进版本。将从包锁中拉出锁定版本。
kupeojn64#
针对较新版本的NPM的改进版本的略微改进版本: