【现已实现了一个原型】Nodejs想法:记录和管理自己所用的依赖版本

【现已实现了一个原型】Nodejs想法:记录和管理自己所用的依赖版本

因为之前被坑过几次,所以现在建项目往往都是把 package.json 中的依赖版本写死成某个版本,防止某个依赖更新后引入新的 bug, 或者做了不兼容的修改。 但是写死了版本之后,偶尔还要更新一下依赖的版本,以便紧跟新版本的节奏,学习和使用新的功能。 然后以后再建新的项目的时候,经常要翻最近写的其他项目,把每个库的自己用过感觉没问题的那个版本找出来,写在新项目的 package.json 里。

上面这个过程似乎很麻烦,我想制作一个工具来管理每个库的「自己用过感觉没问题」的版本,你可以从一个项目中导入你用过的版本,它把这些版本记在一起,然后建新项目的时候自动生成 package.json, 当然,生成的时候你要去选择这个项目你需要用到哪些库。


10 回复

【现已实现了一个原型】Nodejs想法:记录和管理自己所用的依赖版本

背景

在开发过程中,我们经常会遇到依赖库更新带来的问题。有时候,这些更新会引入新的bug或者进行不兼容的修改。为了避免这些问题,我通常会在package.json文件中固定依赖库的版本。然而,这样做也有其不便之处,比如需要定期更新依赖版本以获取新功能,同时在创建新项目时还需要手动查找和复制之前的版本信息。

解决方案

为了解决上述问题,我设计并实现了一个工具,该工具可以帮助我们记录和管理在不同项目中使用过的依赖版本。通过这个工具,我们可以从现有项目中导入已使用的依赖版本,并在创建新项目时自动生成包含这些版本的package.json文件。

工具实现

  1. 记录已使用的依赖版本

    • 我们可以创建一个简单的命令行工具,用于解析现有项目的package.json文件,提取已使用的依赖版本,并将其存储在一个本地数据库或文件中。
  2. 生成新的package.json文件

    • 在创建新项目时,用户可以选择需要的依赖库,并从存储的版本信息中自动填充这些库的版本号。

示例代码

// 安装必要的依赖
const fs = require('fs');
const path = require('path');

// 假设我们有一个名为 `used-versions.json` 的文件来存储已使用的依赖版本
const versionsFilePath = path.join(__dirname, 'used-versions.json');

// 读取已使用的依赖版本
function readUsedVersions() {
    if (fs.existsSync(versionsFilePath)) {
        return JSON.parse(fs.readFileSync(versionsFilePath, 'utf8'));
    }
    return {};
}

// 将依赖版本写入文件
function writeUsedVersions(versions) {
    fs.writeFileSync(versionsFilePath, JSON.stringify(versions, null, 2), 'utf8');
}

// 示例函数:从现有项目中提取依赖版本
function extractUsedVersionsFromProject(projectPath) {
    const packageJsonPath = path.join(projectPath, 'package.json');
    if (fs.existsSync(packageJsonPath)) {
        const packageJson = require(packageJsonPath);
        const usedVersions = readUsedVersions();
        Object.keys(packageJson.dependencies).forEach(dependency => {
            if (!usedVersions[dependency]) {
                usedVersions[dependency] = packageJson.dependencies[dependency];
            }
        });
        writeUsedVersions(usedVersions);
    }
}

// 示例函数:生成新的 package.json 文件
function generateNewPackageJson(selectedDependencies) {
    const usedVersions = readUsedVersions();
    const newPackageJson = {
        name: 'new-project',
        version: '1.0.0',
        dependencies: {}
    };

    selectedDependencies.forEach(dependency => {
        if (usedVersions[dependency]) {
            newPackageJson.dependencies[dependency] = usedVersions[dependency];
        }
    });

    fs.writeFileSync(path.join(__dirname, 'package.json'), JSON.stringify(newPackageJson, null, 2), 'utf8');
}

// 使用示例
extractUsedVersionsFromProject('./existing-project'); // 从现有项目中提取依赖版本
generateNewPackageJson(['lodash', 'express']); // 生成新的 package.json 文件

总结

通过这个工具,我们可以更方便地管理和记录在不同项目中使用的依赖版本,从而提高开发效率和项目的稳定性。


虽然觉得没必要, 不过挺有意思的…

刚刚改了一个霸气的名字:https://github.com/jysperm/dependence-version-manager 在 npm 上叫 dvm

楼上都是夜猫子~

…你们肯定没女朋友

高大上的做法是对项目所用到的依赖库接口一律内建测试,就是成本太高……

可以搭建一个私有cnpm, 把自动更新关掉。 然后所有依赖从这儿取, 需要 更新的时候同步下就可以了。。

npm shrinkwrap 就是干这个的呀… https://www.npmjs.org/doc/cli/npm-shrinkwrap.html

根据你的描述,你想创建一个工具来管理和记录你在不同项目中使用的依赖版本。这个工具可以让你从现有的项目中导出依赖版本信息,并在创建新项目时自动生成 package.json 文件。以下是一个简单的实现思路:

  1. 导出依赖版本: 创建一个脚本,可以从现有项目的 package.json 文件中读取依赖版本,并将其保存到一个自定义文件(例如 .used-versions.json)中。

  2. 导入依赖版本: 创建一个命令行工具,允许用户从上述自定义文件中导入依赖版本,并生成新的 package.json 文件。

示例代码

导出依赖版本

const fs = require('fs');
const path = require('path');

function exportUsedVersions() {
    const currentDir = process.cwd();
    const packageJsonPath = path.join(currentDir, 'package.json');
    
    if (!fs.existsSync(packageJsonPath)) {
        console.error('No package.json found in the current directory.');
        return;
    }

    const packageJson = JSON.parse(fs.readFileSync(packageJsonPath));
    const usedVersions = {};

    // 假设我们只关心dependencies和devDependencies
    ['dependencies', 'devDependencies'].forEach(key => {
        if (packageJson[key]) {
            usedVersions[key] = packageJson[key];
        }
    });

    const outputFilePath = path.join(currentDir, '.used-versions.json');
    fs.writeFileSync(outputFilePath, JSON.stringify(usedVersions, null, 2));
    console.log(`Used versions saved to ${outputFilePath}`);
}

exportUsedVersions();

导入依赖版本

const fs = require('fs');
const path = require('path');

function importUsedVersions() {
    const currentDir = process.cwd();
    const usedVersionsPath = path.join(currentDir, '.used-versions.json');

    if (!fs.existsSync(usedVersionsPath)) {
        console.error('.used-versions.json not found in the current directory.');
        return;
    }

    const usedVersions = JSON.parse(fs.readFileSync(usedVersionsPath));

    const newProjectJson = {
        name: 'new-project',
        version: '1.0.0',
        dependencies: usedVersions.dependencies || {},
        devDependencies: usedVersions.devDependencies || {}
    };

    const packageJsonPath = path.join(currentDir, 'package.json');
    fs.writeFileSync(packageJsonPath, JSON.stringify(newProjectJson, null, 2));
    console.log(`New project package.json created at ${packageJsonPath}`);
}

importUsedVersions();

使用方法

  1. 在一个已经配置好依赖的项目中运行 node export.js 来导出依赖版本。
  2. 在新项目目录中运行 node import.js 来导入依赖版本并生成新的 package.json

这个简单工具可以帮助你快速复制依赖版本,简化项目初始化过程。你可以在此基础上扩展更多功能,比如支持更复杂的依赖关系处理、用户交互界面等。

回到顶部