<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案越來越多,版本管理越來越麻煩,在專案上我使用 maven version
來進行版本管理。主要還是在分散式專案中模組眾多的場景中使用,畢竟各個模組對外的版本需要保持統一。
關於這個外掛如何使用呢?也是非常的簡單。只需要在maven檢視中進行設定版本號即可將分模組專案的版本進行升級了。
除了idea外掛外,maven本身也提供了一個版本管理工具 versions-maven-plugin
。 具體用法以後有機會在贅述。
batfhmerge.sh
和 batchgrade.sh
就搞定了。SNAPSHOT
版本來保證別人拉取到你最新的功能程式碼,但是有些公司會要求使用非 SNAPSHOT
版本進行管理也就是正式版本,這樣做的好處就是容易找到之前的版本程式碼功能。之前用SHELL 實現了自動更新置頂專案的版本號為最新日期字尾。雖然使用起來沒發現有什麼BUG, 但是感覺程式碼實現上還是很弱智的。
# 該指令碼主要用來升級發包期間修改各服務版本 FILEPATH=$1 GROUPID=$2 ARTIFACTID=$3 FILENAME=$4 while getopts ":f:g:a:" opt do case $opt in f) FILENAME=$OPTARG echo "您輸入的檔案設定:$FILENAME" ;; g) GROUPID=$OPTARG echo "您輸入的groupid設定:$GROUPID" ;; a) ARTIFACTID=$OPTARG echo "您輸入的artifactid設定:$ARTIFACTID" ;; ff) FILENAME=$OPTARG echo "您輸入的帶修改檔案為:$FILENAME" ;; ?) echo "未知引數" exit 1;; esac done echo "開始修改版本號" NEWCONTENT=1.2.5.$(date +%Y%m%d) LINE=`cat ${FILENAME} | grep -n -A 1 '<groupId>'"${GROUPID}"'</groupId>'| grep -n '<artifactId>'"${ARTIFACTID}"'</artifactId>' | awk -F "[:-]+" '{print $2}'` echo 具體行號:$LINE if [[ -z $LINE ]] then echo 未匹配 exit fi VERSIONOLDCONTENT=`sed -n ''"$((LINE+1))"'p' ${FILENAME}| grep '[0-9a-zA-Z.-]+' -Eo | sed -n '2p'` echo ${VERSIONOLDCONTENT} #gsed -i ''"$((LINE+1))"'c'"${NEWCONTENT}"'' pom.xml sed -i "" ''"$((LINE+1))"'s/'"${VERSIONOLDCONTENT}"'/'"${NEWCONTENT}"'/' ${FILENAME}
groupId
和 artifactId
,最後確定好 version
對應的行號將最新的日期字尾版本進行填充進去。SED
進行操作,那就需要先獲取到以前的舊版本,然後進行替換操作。pom.xml
檔案他是一個 XML 格式的檔案, XML=eXtensible Markup Language 。即是一種可延伸的標示語言。它與 JSON 一樣主要用來儲存和傳輸資料。在之前的Springboot章節中我們也實現瞭如何實現介面傳遞 XML 資料結構。常見的 XML 程式設計介面有 DOM 和 SAX,這兩種介面處理 XML 檔案的方式不同,當然使用場合也不同。
Python 有三種方法解析 XML,SAX,DOM,以及 ElementTree:
### 1.SAX (simple API for XML ) Python 標準庫包含 SAX 解析器,SAX 用事件驅動模型,通過在解析XML的過程中觸發一個個的事件並呼叫使用者定義的回撥函數來處理XML檔案。 ### 2.DOM(Document Object Model) 將 XML 資料在記憶體中解析成一個樹,通過對樹的操作來操作XML。 ### 3.ElementTree(元素樹)
而我所採用的就是最後一種方式 ElementTree
。
ElementTree
在 python3中已經作為標準庫存在了,所以這裡不需要我們額外的安裝。基於事件和基於檔案的APID來解析XML,可以使用XPath表示式搜尋已解析的檔案,具有對檔案的增刪改查的功能,該方式需要注意大xml檔案,因為是一次性載入到記憶體,所以如果是大xml檔案,不推薦使用該模組解析,應該使用sax方式
不能說最好只能說他是合適的工具,因為 pom.xml
檔案不會很大的。ElementTree
通過 XPath
進行節點選擇,所以關於xml 節點查詢我們可以參考 xpath 語法即可。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.github.zxhTom</groupId> <artifactId>bottom</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>bottom</name> <url>http://maven.apache.org</url> <description>最底層的繁瑣封裝</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <log4j2.version>2.10.0</log4j2.version> </properties> <dependencies> <!-- 20180927提供了針對stirng bean list 等判斷的操作。不用我們在詳細的判斷了 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> <!-- 提供了針對list 等判斷的操作。不用我們在詳細的判斷了 --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <!-- jsonobeject jar包依賴 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> <!-- 紀錄檔記錄 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <!-- 通過反射獲取標有註解的類 --> <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.10</version> </dependency> </dependencies> </project>
上面的 pom.xml
摘自於 com.github.zxhTom
的 bottom 專案中。裡面的恰好出現了註釋,方便我們後期測試。
import xml.etree.ElementTree as ET with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf) print(tree)
ET.parse
即可解析出來 xml 。檢視pom.xml所有節點標籤名稱
import xml.etree.ElementTree as ET with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf) # 根據tree進行遍歷 for node in tree.iter(): print(node.tag)
讀取xml中dependency我想看下所有的 dependency 標籤,只有這樣我才能夠匹配是否是我需要的那個maven座標。
import xml.etree.ElementTree as ET with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf) # tree遍歷 for node in tree.findall('.//dependency'): print(node.tag)
pom.xml
中的名稱空間,在跟節點 project 標籤中設定的xmlns
屬性。至於為什麼需要這個呢?每個xml 標籤內容都是自定義的,比如你可以將dependency用來做版本號的作用,只要你自己解析的時候注意就行了。而maven中將dependency作為引入座標的概念,每個人的想法不一,所以引入名稱空間,在指定的名稱空間中標籤的作用是唯一的,這就是 xmlns
存在的意義。import xml.etree.ElementTree as ET with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf) # tree遍歷 for node in tree.findall('.//{http://maven.apache.org/POM/4.0.0}dependency'): print(node.tag)
com.alibaba.fastjson
的版本號是 1.2.28
import xml.etree.ElementTree as ET with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf) # tree遍歷 for node in tree.findall('.//{http://maven.apache.org/POM/4.0.0}dependency'): groupIdNode=node.find('.{http://maven.apache.org/POM/4.0.0}groupId') artifactNode=node.find('.{http://maven.apache.org/POM/4.0.0}artifactId') if(artifactNode.text=='fastjson' and groupIdNode.text=='com.alibaba'): print(node.find('.{http://maven.apache.org/POM/4.0.0}version').text)
python3 upgrade.py
即可列印出 1.2.28
。說了這麼多,還記得我們一開始的任務嗎,沒錯就是修改掉pom.xml 中指定jar的版本號。這裡就將 com.alibaba.fastjson
的版本號升級為1.2.29
吧。
import xml.etree.ElementTree as ET with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf) # tree遍歷 for node in tree.findall('.//{http://maven.apache.org/POM/4.0.0}dependency'): groupIdNode=node.find('.{http://maven.apache.org/POM/4.0.0}groupId') artifactNode=node.find('.{http://maven.apache.org/POM/4.0.0}artifactId') if(artifactNode.text=='fastjson' and groupIdNode.text=='com.alibaba'): node.find('.{http://maven.apache.org/POM/4.0.0}version').text='1.2.29' tree.write('pom.xml')
pom.xml
好像並不是只改了version標籤的內容。
API追蹤
def write(self, file_or_filename, encoding=None, xml_declaration=None, default_namespace=None, method=None, *, short_empty_elements=True):
上述提到了三個問題都是很常見的問題,因為我們開啟 /Lib/xml/etree/ElementTree.py
原始碼就能夠看到在寫會 xml 檔案的時候我們一共有7個引數可選,其中第一個self 沒啥好說的。
屬性 | 作用 |
---|---|
file_or_filename | 檔案 |
encoding | 輸出的編碼格式;預設US-ASCII |
xml_declaration | 將XML宣告新增到檔案中: True新增;False不新增;None在非US-ASCII 或 UTF-8 或 Unicode時新增; 預設None |
default_namespace | 預設的名稱空間 |
method | xml、 html 、 text。預設 xml |
short_empty_elements | 空內容的標籤時的處理 |
字首ns0很明顯是我們沒有指定輸出的預設名稱空間導致程式自動生成一個字首。
tree.write('pom.xml',default_namespace='http://maven.apache.org/POM/4.0.0')
當我們指定了名稱空間,這個時候再檢視下檔案節點的字首問題就解決了。
中文亂碼就是我們沒有指定編碼格式。大家都知道預設的 US-ASCII 都是人家老外的東西,我們國內想正常使用肯定還是需要 UTF-8
的。
tree.write('pom.xml',default_namespace='http://maven.apache.org/POM/4.0.0',encoding='UTF-8')
這裡我也就不截圖了,筆者親測是可以解決中文亂碼的問題的。
這不算個問題,不知道你有沒有發現上面我提供的 pom.xml 嚴格意義上來說不是一個標準的 xml 檔案,就好比你上學不帶紅領巾就不是一個標準學生一樣,上面的pom.xml 確實了xml的標準開頭申明。不過沒關係我們在wirte的時候注意到有一個引數 xml_declaration
就是控制是否生成標準申明的。
關於註釋丟了這種問題,怎麼說呢?無關緊要吧但是往往註釋是進行解釋說明的,為了追求完美我還是希望能夠將註釋保留下來。關於註釋的問題我們還得簡單檢視下原始碼說明。
with open('pom.xml', 'tr', encoding='utf-8') as rf: tree = ET.parse(rf)
parse 對應的就是 ElementTree 的原始碼中 parse 中。
到了這裡我們應該不難看出,在渲染的時候主要是通過 TreeBuilder
進行渲染的,其中 CommentHandler 就是 TreeBuilder.comment 進行的。那麼我們繼續檢視下 TreeBuilder 的原始碼來檢視為什麼預設的 parser 沒有保留下注釋。
_comment_factory
, 而這個類就是產生 Comment 。 因為insert_comments=False , 所以預設的TreeBuilder對於註釋只會產生一個空的Comment物件,所以我們通過ET.write出來的pom.xml中關於註釋部分就是空白代替,就是因為這個原因。class CommentedTreeBuilder (ET.TreeBuilder): def comment(self,data): self.start(ET.Comment,{}) self.data(data) self.end(ET.Comment)
parser = ET.XMLParser(target=CommentedTreeBuilder()) tree = ET.parse(xml_path,parser=parser)
就的版本是 getchildren , 但是在新版本中直接廢棄了這個方法。而在新版本中是通過 iter(tag) 進行建立迭代器的。但tag=None或者 * 表示所有子孫節點,其他的情況就只查詢指定tag 名稱的集合。
還記得我們是如何解析獲取到 pom.xml 中的標籤的。
# tree遍歷 for node in tree.findall('.//{http://maven.apache.org/POM/4.0.0}dependency'): print(node.tag)
這種方式我只想說NO , 每次在通過xpath 定位節點都需要新增字首,這簡直是個噩夢。
ns = {'real_mvn': 'http://maven.apache.org/POM/4.0.0', 'vistual': 'http://characters.zxhtom.com'} # tree遍歷 for node in tree.findall('.//real_mvn:dependency',ns): print(node.tag)
檔案 | dependency數量 |
---|---|
knife4j-spring-ui-1.9.6.pom | 0 |
spring-context-support-1.0.6.pom | 3 |
spring-core-5.1.7.RELEASE.pom | 10 |
springfox-swagger-common-3.0.0.pom | 11 |
參考文章
到此這篇關於python自動更新pom檔案的文章就介紹到這了,更多相關python自動更新內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45