NodeJS 有办法从package-lock.json中提取package.json吗?

41ik7eoe  于 2023-05-28  发布在  Node.js
关注(0)|答案(4)|浏览(222)

我正在处理一个缺少package.json文件的项目。开发人员推送了package-lock.json文件,但未推送package.json文件。
如何从package-lock.json文件创建一个干净的package.json?

v6ylcynt

v6ylcynt1#

不可能从package-lock.json生成完整的package.json,因为后者不包含所有必要的数据。它只包含特定版本的依赖项列表,而没有原始的semvers。生产和开发依赖沿着嵌套依赖混合在一起。
可以生成新的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键来过滤掉,但这会影响项目自身的依赖项。

b0zn9rqh

b0zn9rqh2#

只需运行npm init,如果您已经生成了node_modules/,它将从package-lock.json中提取所有当前依赖项。如果没有,运行npm cipackage-lock.json生成节点模块,然后运行npm init生成package.json文件。

nkhmeac6

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));
kupeojn6

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));

相关问题