React Native自动化脚本:任务自动化和工作流
【免费下载链接】react-native 一个用于构建原生移动应用程序的 JavaScript 库,可以用于构建 iOS 和 Android 应用程序,支持多种原生移动平台,如 iOS,Android,React Native 等。 项目地址: https://gitcode.***/GitHub_Trending/re/react-native
引言:为什么需要自动化脚本?
在React Native开发过程中,开发者经常需要执行重复的任务,如运行测试、构建应用、发布版本等。这些任务如果手动完成,不仅耗时费力,还容易出错。自动化脚本能够帮助开发者将这些重复任务自动化,提高开发效率,减少人为错误,确保开发流程的一致性和可靠性。
本文将深入探讨React Native项目中的自动化脚本,包括任务自动化和工作流管理。我们将从脚本结构、核心功能、实际应用场景等方面进行详细介绍,并通过代码示例和流程图帮助读者更好地理解和应用这些自动化脚本。
React Native自动化脚本概览
React Native项目中的自动化脚本通常使用JavaScript编写,利用Node.js的强大功能来执行各种任务。这些脚本可以通过命令行工具(如npm、yarn)来运行,也可以集成到CI/CD(持续集成/持续部署)流程中,实现全自动化的开发、测试和部署。
脚本目录结构
在React Native项目中,自动化脚本通常存放在scripts目录下。该目录包含了各种功能的脚本文件,如测试脚本、构建脚本、发布脚本等。以下是一个典型的scripts目录结构:
scripts/
├── run-ci-javascript-tests.js # 运行JavaScript测试
├── clean-gha-cache.js # 清理GitHub Actions缓存
├── test-release-local.js # 本地测试发布流程
├── releases/ # 发布相关脚本
│ ├── create-release-***mit.js # 创建发布提交
│ ├── set-version.js # 设置版本号
│ └── upload-release-assets.js # 上传发布资产
└── shared/ # 共享工具函数
├── consts.js # 常量定义
└── monorepoUtils.js # monorepo工具函数
脚本核心功能
React Native自动化脚本主要实现以下核心功能:
- 测试自动化:自动运行单元测试、集成测试、E2E测试等,确保代码质量。
- 构建自动化:自动构建应用的开发版、测试版和发布版。
- 版本管理:自动管理版本号,生成CHANGELOG,创建发布提交。
- 部署自动化:自动将应用部署到测试环境或生产环境。
- 代码质量检查:自动运行ESLint、Flow等工具,检查代码质量。
测试自动化脚本
测试是保证代码质量的重要手段,React Native项目中的测试自动化脚本能够帮助开发者自动运行各种测试,及时发现和修复问题。
run-ci-javascript-tests.js:CI环境中的JavaScript测试
run-ci-javascript-tests.js是一个在CI环境中运行JavaScript测试的脚本。它集成了多种测试工具和任务,确保代码在提交前通过所有测试。
脚本结构
const {execSync} = require('child_process');
const argv = require('yargs').argv;
class ExecError extends Error {
constructor(cause) {
super(cause.message, {cause});
this.name = 'ExecError';
}
}
function describe(message) {
console.log(`\n\n>>>>> ${message}\n\n\n`);
}
try {
console.log('Executing JavaScript tests');
describe('Test: feature flags codegen');
execAndLog(`${YARN_BINARY} run featureflags --verify-unchanged`);
describe('Test: eslint');
execAndLog(`${YARN_BINARY} run lint`);
// 更多测试任务...
} catch (e) {
if (e instanceof ExecError) {
console.error(e.message);
process.exitCode = 1;
} else {
throw e;
}
}
function execAndLog(***mand) {
console.log(`Executing: ${***mand}`);
try {
execSync(***mand, {stdio: ['ignore', 'inherit', 'inherit']});
} catch (e) {
throw new ExecError(e);
}
}
核心功能
-
参数解析:使用
yargs库解析命令行参数,如--maxWorkers、--jestBinary等。 - 测试任务执行:按顺序执行多个测试任务,包括feature flags验证、ESLint检查、Flow类型检查、Jest测试等。
-
错误处理:自定义
ExecError类来捕获和处理命令执行错误,确保脚本能够优雅地处理失败情况。 -
日志输出:使用
describe函数和execAndLog函数提供详细的日志输出,方便开发者跟踪测试进度和问题。
工作流程
使用示例
# 基本用法
node scripts/run-ci-javascript-tests.js
# 指定最大工作线程数
node scripts/run-ci-javascript-tests.js --maxWorkers=4
# 指定Jest二进制文件路径
node scripts/run-ci-javascript-tests.js --jestBinary=./node_modules/.bin/jest
版本管理自动化脚本
版本管理是软件开发过程中的重要环节,包括版本号更新、CHANGELOG生成、发布提交创建等任务。React Native项目中的版本管理自动化脚本能够帮助开发者简化这些任务,确保版本管理的一致性和准确性。
set-version.js:版本号更新
set-version.js是一个用于更新项目中所有包版本号的脚本。它能够自动更新monorepo项目中所有包的package.json文件,并生成相应的版本文件。
核心功能
- 版本号解析:解析命令行传入的版本号,验证版本号格式。
-
包版本更新:更新monorepo项目中所有包的
package.json文件中的版本号。 - 依赖版本更新:更新包之间的依赖版本号,确保依赖关系正确。
-
生成版本文件:生成React Native项目所需的版本文件,如
ReactNativeVersion.java和ReactNativeVersion.h。
代码示例
async function setVersion(version, skipReactNativeVersion = false) {
const packages = await getPackages({
includePrivate: true,
includeReactNative: true,
});
// 创建新版本号映射
const newPackageVersions = Object.fromEntries(
Object.entries(packages).map(([packageName, {packageJson}]) => {
let packageVersion = version;
if (packageName === 'react-native' && skipReactNativeVersion) {
packageVersion = '1000.0.0';
} else if (packageJson.private === true) {
packageVersion = packageJson.version ?? '0.0.0';
}
return [packageName, packageVersion];
}),
);
// 更新所有包的package.json文件
const packagesToUpdate = [
await getWorkspaceRoot(),
...Object.values(packages),
];
await Promise.all(
packagesToUpdate.map(pkg => updatePackageJson(pkg, newPackageVersions)),
);
// 更新React Native版本文件
if (!skipReactNativeVersion) {
await updateReactNativeArtifacts(version);
}
}
使用示例
# 基本用法
node scripts/releases/set-version.js 0.72.0
# 跳过React Native版本更新
node scripts/releases/set-version.js 0.72.0 --skipReactNativeVersion
create-release-***mit.js:创建发布提交
create-release-***mit.js是一个用于创建发布提交的脚本。它能够自动生成发布提交信息,创建版本标签,并准备发布到npm。
核心功能
- 版本验证:验证版本号的有效性,确定发布类型(正式版、预发布版)。
- 发布提交创建:创建包含版本号和发布信息的提交。
- 版本标签创建:创建版本标签,方便后续发布和回溯。
-
npm标签设置:根据发布类型设置相应的npm标签(如
latest、next)。
工作流程
使用示例
# 创建正式版发布提交
node scripts/releases/create-release-***mit.js --reactNativeVersion 0.72.0 --tagAsLatestRelease true
# 创建预发布版发布提交
node scripts/releases/create-release-***mit.js --reactNativeVersion 0.72.0-rc.1 --tagAsLatestRelease false
自动化工作流集成
自动化脚本的最大价值在于集成到整个开发工作流中,实现从代码提交到应用发布的全流程自动化。React Native项目通常会将自动化脚本与CI/CD工具(如GitHub Actions、Jenkins等)集成,实现自动化测试、构建和部署。
CI/CD工作流示例
以下是一个基于GitHub Actions的React Native自动化工作流示例,它集成了测试、构建和发布等自动化脚本。
name: React Native CI/CD
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'yarn'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Run tests
run: node scripts/run-ci-javascript-tests.js
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'yarn'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build
run: yarn build
release:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'yarn'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Create release ***mit
run: node scripts/releases/create-release-***mit.js --reactNativeVersion 0.72.0 --tagAsLatestRelease true
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
自动化脚本在工作流中的作用
- 代码提交阶段:通过pre-***mit钩子运行代码格式化和 lint 脚本,确保提交的代码符合项目规范。
- CI阶段:在CI服务器上运行测试脚本,包括单元测试、集成测试等,确保代码质量。
- 构建阶段:运行构建脚本,生成应用安装包或库文件。
- 发布阶段:运行版本管理和发布脚本,更新版本号、创建发布提交、发布到npm等。
自定义自动化脚本开发
除了使用项目中已有的自动化脚本,开发者还可以根据自己的需求开发自定义的自动化脚本。以下是开发自定义自动化脚本的步骤和最佳实践。
开发步骤
- 确定需求:明确脚本需要解决的问题和实现的功能。
-
选择工具:选择合适的工具和库,如
child_process用于执行命令,yargs用于解析命令行参数。 - 编写代码:实现脚本的核心功能,注意错误处理和日志输出。
- 测试脚本:在本地环境中测试脚本,确保其正确性和稳定性。
- 集成到工作流:将脚本集成到开发工作流中,如添加到npm scripts或CI配置中。
最佳实践
- 模块化设计:将脚本拆分为多个模块,提高代码的可维护性和复用性。
- 错误处理:完善的错误处理机制,确保脚本能够优雅地处理各种异常情况。
- 日志输出:详细的日志输出,方便问题排查和进度跟踪。
- 参数化:通过命令行参数或配置文件使脚本更加灵活,适应不同的使用场景。
- 文档化:为脚本添加详细的注释和使用说明,方便其他开发者使用。
自定义脚本示例:自动生成CHANGELOG
以下是一个自动生成CHANGELOG的脚本示例,它能够根据提交信息自动生成CHANGELOG文件。
const {execSync} = require('child_process');
const fs = require('fs');
const path = require('path');
// 获取最新版本标签
const getLatestTag = () => {
try {
return execSync('git describe --abbrev=0 --tags', {encoding: 'utf8'}).trim();
} catch (e) {
return 'v0.0.0';
}
};
// 获取最新版本以来的提交信息
const get***mits = (fromTag) => {
const ***mits = execSync(`git log ${fromTag}..HEAD --pretty=format:"%s"`, {encoding: 'utf8'});
return ***mits.split('\n').filter(***mit => ***mit.trim() !== '');
};
// 生成CHANGELOG内容
const generateChangelog = (version, ***mits) => {
const date = new Date().toISOString().split('T')[0];
let changelog = `## ${version} (${date})\n\n`;
const ***mitTypes = {
'feat': 'Features',
'fix': 'Bug Fixes',
'docs': 'Documentation',
'style': 'Style',
'refactor': 'Refactoring',
'perf': 'Performance',
'test': 'Tests',
'build': 'Build',
'ci': 'CI',
'chore': 'Chores'
};
const ***mitGroups = {};
***mits.forEach(***mit => {
const [type, ...rest] = ***mit.split(':');
if (!type || !rest.length) {
return;
}
const message = rest.join(':').trim();
const groupName = ***mitTypes[type] || 'Other';
if (!***mitGroups[groupName]) {
***mitGroups[groupName] = [];
}
***mitGroups[groupName].push(`- ${message}`);
});
Object.entries(***mitGroups).forEach(([group, messages]) => {
changelog += `### ${group}\n\n`;
changelog += messages.join('\n') + '\n\n';
});
return changelog;
};
// 主函数
const main = () => {
const version = process.argv[2];
if (!version) {
console.error('请指定版本号');
process.exit(1);
}
const latestTag = getLatestTag();
const ***mits = get***mits(latestTag);
const changelogContent = generateChangelog(version, ***mits);
const changelogPath = path.join(__dirname, '../CHANGELOG.md');
const existingContent = fs.existsSync(changelogPath) ? fs.readFileSync(changelogPath, 'utf8') : '';
const newContent = changelogContent + (existingContent ? `\n${existingContent}` : '');
fs.writeFileSync(changelogPath, newContent);
console.log(`CHANGELOG已更新至版本 ${version}`);
};
main();
总结
自动化脚本是React Native开发过程中的重要工具,能够帮助开发者提高开发效率、减少人为错误、确保开发流程的一致性和可靠性。本文介绍了React Native项目中的自动化脚本,包括测试自动化、版本管理自动化、工作流集成等方面,并提供了自定义自动化脚本的开发步骤和最佳实践。
通过合理使用和开发自动化脚本,开发者可以将更多的时间和精力投入到核心业务逻辑的开发中,提高产品质量和开发效率。希望本文能够帮助读者更好地理解和应用React Native自动化脚本,构建更加高效和可靠的开发流程。
参考资料
- React Native官方文档:https://reactnative.dev/docs/getting-started
- Node.js官方文档:https://nodejs.org/en/docs/
- npm scripts文档:https://docs.npmjs.***/cli/v7/using-npm/scripts
- GitHub Actions文档:https://docs.github.***/en/actions
【免费下载链接】react-native 一个用于构建原生移动应用程序的 JavaScript 库,可以用于构建 iOS 和 Android 应用程序,支持多种原生移动平台,如 iOS,Android,React Native 等。 项目地址: https://gitcode.***/GitHub_Trending/re/react-native