0

プロジェクトに次の構造のpomファイルがいくつかあります

<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/maven-v4_0_0.xsd">
     <parent>
             <artifactId>xparent</artifactId>
             <groupId>y</groupId>
             <version>2.0.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>someparent</artifactId>
     <version>x.x.x-needs_change</version>
     <packaging>pom</packaging>
     <name>some name</name>
     <description>some description</description>
     <url>myurl</url>

    <modules>
        <module>mymodules</module>
    </modules>

    <properties>
        <my.version>x.x.x-needs_change</my.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>hhhhh</groupId>
    <artifactId>hhhhh</artifactId>
    <version>x.x.x-should not change</version>
    </dependency>
   </dependencies>
</project>

私はsedを使用して、現在のバージョンを入力として指定し、指定された新しいバージョンに変更しています。しかし、依存関係ブロック内のバージョンを変更したくありません。どうすればよいですか?

Mavenバージョンのプラグインルートに行きたくありません。私はそれを試しましたが、それは私の要件に適合していません。

私はsed/pythonスクリプトを好みます。

ありがとう

4

4 に答える 4

2

あなたは試すことができます:

sed -e '/<dependencies>/,/<\/dependencies>/ !{ 
       s!<version>[0-9.]\+</version>!<version>'"$NEWVERSION"'</version>!
       }' MY_FILE

は、「と/<dependencies>/,/<\/dependencies>/の間のすべての行を見つける」と言います。<dependencies></dependencies>

その後、「これらの行以外のすべての場所!次のアクションを実行します(つまり、との間を除くすべての行に対してこれを実行します)」。<dependencies></dependencies>

は、s!<version>[0-9.]\+</version>!<version>'"$NEWVERSION"'</version>!「に置き換えます。新しいバージョン番号<version>...</version>を含む環境変数です。<version>$NEWVERSION</version>$NEWVERSION

引用符( )でおならをしたの'"$NEWVERSION"'は、sedコマンドの主要部分に単一引用符が必要だったためです(感嘆符とバックスラッシュについて心配する必要はありません)が、展開たいのです$NEWVERSION

スクリプトに合わせて変更します。

于 2012-04-03T23:58:53.883 に答える
1

XML を解析して変更するは、sedawk

あなたの POM ファイルは確かに有効な POM ファイルであると思います。つまり、囲み<project>タグも持っています。

>>> t = """<project>
... <parent>
... <artifactID> </artifactID>
... <groupID> </groupID>
... <version>2.0.0</version>
... </parent>
... 
... <properties>
... <version>2.0.0</version>
... </properties>
... 
... <dependencies>
... <dependency>
... <version>2.0.0</version>
... </dependency>
... </dependencies></project>
... """
>>> from lxml import etree
>>> r = etree.fromstring(t)
>>> r.xpath("//parent/version")[0].text = "3.0"
>>> r.xpath("//properties/version")[0].text = "3.0"
>>> print(etree.tostring(r))
<project>
<parent>
<artifactID> </artifactID>
<groupID> </groupID>
<version>3.0</version>
</parent>

<properties>
<version>3.0</version>
</properties>

<dependencies>
<dependency>
<version>2.0.0</version>
</dependency>
</dependencies></project>
于 2012-04-04T07:23:20.020 に答える
0
awk -v change=1 -v newver=2.3.4 '
  change && /version/ {sub(/>[^<]+/, ">" newver)} 
  /<\/?dependencies>/ {change = !change} 
  {print}
'
于 2012-04-04T13:12:29.920 に答える
0
nawk '{
      a=$0;
      getline;
      if($0!~/depend/ && a!~/version/)
      {gsub(/2.0.0/,"1.0.0",$0);print a"\n"$0}
      else print a"\n"$0 
      }' file3

以下はテストです:

pearl.302> cat file3
    <parent>
    <aritifactID> </artifactID>
    <groupID> </groupID>
    <version>2.0.0</version>
    </parent>

    <properties>
    <version>2.0.0</version>
    </properties>

    <dependencies>
    <dependency>
    <version>2.0.0</version>
    </dependency>
    </dependencies>
pearl.303> nawk '{a=$0;
                  getline;
                  if($0!~/depend/ && a!~/version/)
                  {gsub(/2.0.0/,"1.0.0",$0);print a"\n"$0}
                  else print a"\n"$0 }' file3
    <parent>
    <aritifactID> </artifactID>
    <groupID> </groupID>
    <version>1.0.0</version>
    </parent>

    <properties>
    <version>1.0.0</version>
    </properties>

    <dependencies>
    <dependency>
    <version>2.0.0</version>
    </dependency>
    </dependencies>
于 2012-04-04T07:09:46.143 に答える