Есть ли способ извлечь 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));
Другие вопросы по тегам