怎样用脚本批量更新依赖文件?

wen 实用脚本 3

本文目录导读:

怎样用脚本批量更新依赖文件?

  1. Node.js (package.json)
  2. Python (requirements.txt)
  3. Java (Maven - pom.xml)
  4. Java (Gradle - build.gradle)
  5. 通用批量更新脚本
  6. 安全批量更新策略
  7. 自动化更新工具
  8. 最佳实践

Node.js (package.json)

使用 npm-check-updates

# 安装
npm install -g npm-check-updates
# 检查所有依赖的更新
ncu
# 更新所有依赖到最新版本
ncu -u
# 更新到指定版本类型
ncu --target minor  # 只更新小版本
ncu --target patch  # 只更新补丁版本
# 更新后重新安装
npm install

使用 npm-upgrade

npx npm-upgrade

批量更新脚本

// update-deps.js
const { execSync } = require('child_process');
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
Object.keys(deps).forEach(pkg => {
  try {
    execSync(`npm install ${pkg}@latest`, { stdio: 'inherit' });
    console.log(`✅ Updated ${pkg}`);
  } catch (error) {
    console.error(`❌ Failed to update ${pkg}`);
  }
});

Python (requirements.txt)

使用 pip-review

# 安装
pip install pip-review
# 列出可更新的包
pip-review --local
# 自动更新所有包
pip-review --auto
# 交互式更新
pip-review --interactive

使用 pip-upgrader

# 安装
pip install pip-upgrader
# 更新所有包
pip-upgrade
# 更新指定包
pip-upgrade django requests

批量更新脚本

# update_python_deps.py
import subprocess
import re
def get_outdated_packages():
    result = subprocess.run(['pip', 'list', '--outdated', '--format=columns'], 
                          capture_output=True, text=True)
    packages = []
    for line in result.stdout.strip().split('\n')[2:]:
        if line.strip():
            pkg = line.split()[0]
            packages.append(pkg)
    return packages
def update_packages(packages):
    for pkg in packages:
        try:
            subprocess.run(['pip', 'install', '--upgrade', pkg], check=True)
            print(f"✅ Updated {pkg}")
        except subprocess.CalledProcessError:
            print(f"❌ Failed to update {pkg}")
if __name__ == "__main__":
    outdated = get_outdated_packages()
    if outdated:
        print(f"Found {len(outdated)} outdated packages")
        update_packages(outdated)
    else:
        print("All packages are up to date!")

Java (Maven - pom.xml)

使用 versions-maven-plugin

<!-- pom.xml 添加插件 -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>2.16.0</version>
</plugin>
# 检查更新
mvn versions:display-dependency-updates
# 更新到最新版本
mvn versions:use-latest-releases
# 更新到最新快照
mvn versions:use-latest-snapshots
# 更新属性中定义的版本
mvn versions:update-properties

Java (Gradle - build.gradle)

# 检查依赖更新
gradle dependencyUpdates
# 需要添加插件

build.gradle 中添加:

plugins {
    id 'com.github.ben-manes.versions' version '0.50.0'
}

通用批量更新脚本

Bash 脚本

#!/bin/bash
# update_all_deps.sh
# Node.js
if [ -f "package.json" ]; then
    echo "📦 Updating Node.js dependencies..."
    npx npm-check-updates -u
    npm install
fi
# Python
if [ -f "requirements.txt" ]; then
    echo "🐍 Updating Python dependencies..."
    pip install --upgrade pip
    pip-review --auto
fi
# Ruby
if [ -f "Gemfile" ]; then
    echo "💎 Updating Ruby dependencies..."
    bundle update
fi
# PHP
if [ -f "composer.json" ]; then
    echo "🐘 Updating PHP dependencies..."
    composer update
fi
echo "✅ All dependencies updated!"

安全批量更新策略

#!/bin/bash
# safe_update.sh
# 备份原文件
backup_file() {
    if [ -f "$1" ]; then
        cp "$1" "$1.backup"
        echo "📦 Backup created: $1.backup"
    fi
}
# 回滚
rollback() {
    if [ -f "$1.backup" ]; then
        cp "$1.backup" "$1"
        echo "↩️ Rolled back: $1"
    fi
}
# 示例:更新 npm 包
update_deps_safe() {
    backup_file "package.json"
    backup_file "package-lock.json"
    # 执行更新
    npx npm-check-updates -u
    # 运行测试
    npm test
    if [ $? -eq 0 ]; then
        echo "✅ Tests passed, updates are safe"
    else
        echo "❌ Tests failed, rolling back..."
        rollback "package.json"
        rollback "package-lock.json"
    fi
}

自动化更新工具

Dependabot (GitHub)

.github/dependabot.yml 中配置:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"

Renovate

{
  "extends": ["config:base"],
  "automerge": true,
  "schedule": ["every weekend"]
}

最佳实践

  1. 分批更新:不要一次更新所有包
  2. 版本锁定:使用 lock 文件(package-lock.json, requirements.txt 等)
  3. 测试先行:更新后运行测试套件
  4. 版本控制:更新前创建 git 分支
  5. 监控变更:查看 changelog 了解破坏性变更

选择哪种方式取决于你的技术栈和项目需求。

抱歉,评论功能暂时关闭!