Есть ли способ извлечь package.json из package-lock.json?
Я работаю над проектом, в котором отсутствует файл package.json. Разработчик добавил файл package-lock.json без файла package.json.
Как я могу создать чистый package.json из файла package-lock.json, если это вообще возможно?
4 ответа
Невозможно создать полный package.json
от package-lock.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
ключ, но это может повлиять на собственные зависимости проекта.
Просто беги npm init
и он вытянет все текущие зависимости от package-lock.json
Слегка улучшенная версия принятого скрипта ответов. Вытащит заблокированные версии из package-lock.
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));
Немного улучшенная версия улучшенной версии для новых версий 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));