【现已实现了一个原型】Nodejs想法:记录和管理自己所用的依赖版本
【现已实现了一个原型】Nodejs想法:记录和管理自己所用的依赖版本
因为之前被坑过几次,所以现在建项目往往都是把 package.json 中的依赖版本写死成某个版本,防止某个依赖更新后引入新的 bug, 或者做了不兼容的修改。 但是写死了版本之后,偶尔还要更新一下依赖的版本,以便紧跟新版本的节奏,学习和使用新的功能。 然后以后再建新的项目的时候,经常要翻最近写的其他项目,把每个库的自己用过感觉没问题的那个版本找出来,写在新项目的 package.json 里。
上面这个过程似乎很麻烦,我想制作一个工具来管理每个库的「自己用过感觉没问题」的版本,你可以从一个项目中导入你用过的版本,它把这些版本记在一起,然后建新项目的时候自动生成 package.json, 当然,生成的时候你要去选择这个项目你需要用到哪些库。
【现已实现了一个原型】Nodejs想法:记录和管理自己所用的依赖版本
背景
在开发过程中,我们经常会遇到依赖库更新带来的问题。有时候,这些更新会引入新的bug或者进行不兼容的修改。为了避免这些问题,我通常会在package.json
文件中固定依赖库的版本。然而,这样做也有其不便之处,比如需要定期更新依赖版本以获取新功能,同时在创建新项目时还需要手动查找和复制之前的版本信息。
解决方案
为了解决上述问题,我设计并实现了一个工具,该工具可以帮助我们记录和管理在不同项目中使用过的依赖版本。通过这个工具,我们可以从现有项目中导入已使用的依赖版本,并在创建新项目时自动生成包含这些版本的package.json
文件。
工具实现
-
记录已使用的依赖版本
- 我们可以创建一个简单的命令行工具,用于解析现有项目的
package.json
文件,提取已使用的依赖版本,并将其存储在一个本地数据库或文件中。
- 我们可以创建一个简单的命令行工具,用于解析现有项目的
-
生成新的
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
文件。以下是一个简单的实现思路:
-
导出依赖版本: 创建一个脚本,可以从现有项目的
package.json
文件中读取依赖版本,并将其保存到一个自定义文件(例如.used-versions.json
)中。 -
导入依赖版本: 创建一个命令行工具,允许用户从上述自定义文件中导入依赖版本,并生成新的
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();
使用方法
- 在一个已经配置好依赖的项目中运行
node export.js
来导出依赖版本。 - 在新项目目录中运行
node import.js
来导入依赖版本并生成新的package.json
。
这个简单工具可以帮助你快速复制依赖版本,简化项目初始化过程。你可以在此基础上扩展更多功能,比如支持更复杂的依赖关系处理、用户交互界面等。