這篇文章帶大家繼續angular的學習,介紹一下Angular 結合 Git Commit 版本處理的方法,希望對大家有幫助!
上圖是頁面上展示的測試環境/開發環境
版本資訊。 【相關教學推薦:《angular教學》】
##上圖表示的是每次提交的後面有介紹
Git Commit的信息,當然,這裡我是每次提交都記錄,你可以在每次構建的時候記錄。
Angular 實作下效果,
React 和
Vue 同理。
angular-cli 鷹架直接產生一個專案就可以了。
Step 1: 安裝鷹架工具
npm install -g @angular/cli
Step 2: 建立一個專案
# ng new PROJECT_NAME ng new ng-commit
#Step 3:運行項目
npm run start項目運行起來,預設監聽
4200端口,直接在瀏覽器打開
http://localhost:4200/就行了。
4200 埠沒被佔用的前提下此時,
ng-commit 專案重點資料夾
src 的組成如下:
src ├── app // 应用主体 │ ├── app-routing.module.ts // 路由模块 │ . │ └── app.module.ts // 应用模块 ├── assets // 静态资源 ├── main.ts // 入口文件 . └── style.less // 全局样式上面目錄結構,我們後面會在
app 目錄下增加
services 服務目錄,和
assets 目錄下的
version.json檔。
version.txt,用於儲存提交的資訊;在根目錄建立一個檔案
commit.js,用於操作提交資訊。
commit.js,我們直接進入主題:
const execSync = require('child_process').execSync; const fs = require('fs') const versionPath = 'version.txt' const buildPath = 'dist' const autoPush = true; const commit = execSync('git show -s --format=%H').toString().trim(); // 当前的版本号 let versionStr = ''; // 版本字符串 if(fs.existsSync(versionPath)) { versionStr = fs.readFileSync(versionPath).toString() + '\n'; } if(versionStr.indexOf(commit) != -1) { console.warn('\x1B[33m%s\x1b[0m', 'warming: 当前的git版本数据已经存在了!\n') } else { let name = execSync('git show -s --format=%cn').toString().trim(); // 姓名 let email = execSync('git show -s --format=%ce').toString().trim(); // 邮箱 let date = new Date(execSync('git show -s --format=%cd').toString()); // 日期 let message = execSync('git show -s --format=%s').toString().trim(); // 说明 versionStr = `git:${commit}\n作者:${name}<${email}>\n日期:${date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate()+' '+date.getHours()+':'+date.getMinutes()}\n说明:${message}\n${new Array(80).join('*')}\n${versionStr}`; fs.writeFileSync(versionPath, versionStr); // 写入版本信息之后,自动将版本信息提交到当前分支的git上 if(autoPush) { // 这一步可以按照实际的需求来编写 execSync(`git add ${ versionPath }`); execSync(`git commit ${ versionPath } -m 自动提交版本信息`); execSync(`git push origin ${ execSync('git rev-parse --abbrev-ref HEAD').toString().trim() }`) } } if(fs.existsSync(buildPath)) { fs.writeFileSync(`${ buildPath }/${ versionPath }`, fs.readFileSync(versionPath)) }上面的檔案可以直接透過
node commit.js 進行。為了方便管理,我們在
package.json 上加上命令列:
"scripts": { "commit": "node commit.js" }那樣,使用
npm run commit 同等
node commit.js 的效果。
commit 的訊息,產生指定格式的版本資訊
version .json了。
version.js用來產生版本的資料。
const execSync = require('child_process').execSync; const fs = require('fs') const targetFile = 'src/assets/version.json'; // 存储到的目标文件 const commit = execSync('git show -s --format=%h').toString().trim(); //当前提交的版本号,hash 值的前7位 let date = new Date(execSync('git show -s --format=%cd').toString()); // 日期 let message = execSync('git show -s --format=%s').toString().trim(); // 说明 let versionObj = { "commit": commit, "date": date, "message": message }; const data = JSON.stringify(versionObj); fs.writeFile(targetFile, data, (err) => { if(err) { throw err } console.log('Stringify Json data is saved.') })我們在
package.json 上加上命令列方便管理:
"scripts": { "version": "node version.js" }
development,生產環境
production 和車測試環境
test。
,如:1.1.0
,如:1.1.0:beta
,如:1.1.0-2022.01.01: 4rtr5rg
config ├── default.json // 项目调用的配置文件 ├── development.json // 开发环境配置文件 ├── production.json // 生产环境配置文件 └── test.json // 测试环境配置文件相關的檔案內容如下:
// development.json { "env": "development", "version": "1.3.0" }
// production.json { "env": "production", "version": "1.3.0" }
// test.json { "env": "test", "version": "1.3.0" }
default .json 根據命令列拷貝不同環境的配置訊息,在
package.json 中配置:
"scripts": { "copyConfigProduction": "cp ./config/production.json ./config/default.json", "copyConfigDevelopment": "cp ./config/development.json ./config/default.json", "copyConfigTest": "cp ./config/test.json ./config/default.json", }
Is easy Bro, right?
整合產生版本資訊的內容,得到根據不同環境產生不同的版本訊息,具體程式碼如下:
const execSync = require('child_process').execSync; const fs = require('fs') const targetFile = 'src/assets/version.json'; // 存储到的目标文件 const config = require('./config/default.json'); const commit = execSync('git show -s --format=%h').toString().trim(); //当前提交的版本号 let date = new Date(execSync('git show -s --format=%cd').toString()); // 日期 let message = execSync('git show -s --format=%s').toString().trim(); // 说明 let versionObj = { "env": config.env, "version": "", "commit": commit, "date": date, "message": message }; // 格式化日期 const formatDay = (date) => { let formatted_date = date.getFullYear() + "." + (date.getMonth()+1) + "." +date.getDate() return formatted_date; } if(config.env === 'production') { versionObj.version = config.version } if(config.env === 'development') { versionObj.version = `${ config.version }:beta` } if(config.env === 'test') { versionObj.version = `${ config.version }-${ formatDay(date) }:${ commit }` } const data = JSON.stringify(versionObj); fs.writeFile(targetFile, data, (err) => { if(err) { throw err } console.log('Stringify Json data is saved.') })在
package.json 中添加不同環境的命令列:
"scripts": { "build:production": "npm run copyConfigProduction && npm run version", "build:development": "npm run copyConfigDevelopment && npm run version", "build:test": "npm run copyConfigTest && npm run version", }產生的版本資訊會直接存放在
assets 中,具體路徑為
src/assets/version.json。
angular 結合。
ng generate service version 在
app/services 目錄中產生
version 服務。在生成的
version.service.ts 檔案中新增請求訊息,如下:
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class VersionService { constructor( private http: HttpClient ) { } public getVersion():Observable<any> { return this.http.get('assets/version.json') } }要使用請求之前,要在
app.module.ts 檔案掛載
HttpClientModule 模組:
import { HttpClientModule } from '@angular/common/http'; // ... imports: [ HttpClientModule ],之後在元件中呼叫即可,這裡是
app.component.ts 檔案:
import { Component } from '@angular/core'; import { VersionService } from './services/version.service'; // 引入版本服务 @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.less'] }) export class AppComponent { public version: string = '1.0.0' constructor( private readonly versionService: VersionService ) {} ngOnInit() { this.versionService.getVersion().subscribe({ next: (data: any) => { this.version = data.version // 更改版本信息 }, error: (error: any) => { console.error(error) } }) } }至此,我們完成了版本資訊。我們最後來調整下
package.json 的指令:
"scripts": { "start": "ng serve", "version": "node version.js", "commit": "node commit.js", "build": "ng build", "build:production": "npm run copyConfigProduction && npm run version && npm run build", "build:development": "npm run copyConfigDevelopment && npm run version && npm run build", "build:test": "npm run copyConfigTest && npm run version && npm run build", "copyConfigProduction": "cp ./config/production.json ./config/default.json", "copyConfigDevelopment": "cp ./config/development.json ./config/default.json", "copyConfigTest": "cp ./config/test.json ./config/default.json" }
使用 scripts
一是为了方便管理,而是方便 jenkins
构建方便调用。对于 jenkins
部分,感兴趣者可以自行尝试。
更多编程相关知识,请访问:编程入门!!
以上是Angular怎麼結合Git Commit進行版本處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!