2012-10-10 175 views
2

我想要使用一個條件屬性來設置屬性值爲X,如果另一個屬性被定義,否則爲Y。但是,我不希望用戶能夠從命令行重寫條件屬性。條件屬性被覆蓋

這是如何實現的?

+0

覆蓋屬性:[我如何允許一個Ant屬性文件覆蓋在另一個設置的值?](http://stackoverflow.com/questions/4206080/how-can-i-allow-an-ant-property -file到覆蓋最值集合另一個) – Jarekczek

回答

2

不,你不能覆蓋命令行上設置的屬性。至少,這並不容易。在命令行上覆蓋屬性的全部目的是允許用戶覆蓋默認值,以便按照項目構建的方式進行修改。例如:

<property file="${basedir}/build.properties"/> 
<property name="javac.debug" value="no"/> 

<target name="compile"> 
    <javac destdir="${main.destdir}" 
     debug="${javac.debug}"> 

默認情況下,Java代碼編譯時沒有調試信息。也許這樣做是爲了使jar文件更小,或更快的解釋,或者使代碼難以反編譯和閱讀。無論出於何種原因,這種構建都不會將調試信息放入類文件中。

但是,開發人員需要這麼做調試信息,所以他們希望能夠覆蓋此設置:

$ ant -Djavac.debug=true compile 

或者,他們可以創建一個build.properties文件,並把價值在那裏。

當您不使用Ant進行構建時會出現此類問題。我知道使用Ant腳本進行部署的幾個站點。我通常不喜歡這個,因爲Ant並不是真的爲這種類型的東西製作的。例如,Ant沒有任何內置邏輯或循環。一旦設置了屬性,就無法更改。對於構建語言來說,這些都是很好的想法,但對於通用編程語言卻是一個糟糕的主意。

此外,開發人員不應該爲QA或生產進行構建。這些應該由不會覆蓋默認值的構建服務器來完成。


現在如何摧毀這整個經過深思熟慮的系統,並導致大破壞:

可以使用ant-contrib任務在項目中。這樣做將允許您訪問Ant Contrib var任務以取消設置屬性。

下載ant-contrib.jar文件(無論最新版本是什麼),並將其放入項目下的lib目錄中。然後,你可以這樣做:

<project name="danger-will-robinson" default="package" basedir="." 
    xmlns:ac="http://ant-contrib.sourceforge.net"> 

    <!-- Define the Ant-Contrib tasks --> 
    <taskdef=resource="net/sf/antcontrib/antlib.xml" 
     uri="http://ant-contrib.sourceforge.net"> 
     <classpath> 
      <fileset dir="${basedir}/lib"> 
       <include name="ant-contrib*.jar"/> 
      </fileset> 
     </classpath> 
    </taskdef> 

    <!-- Unset Property "foo", so you can use it --> 
    <ac:var name="foo" unset="true"/> 

注意,<classpath>點在${basedir}/lib目錄螞蟻的contrib罐子。如果您將它檢入到源代碼庫中,它將允許簽出項目的每個人都能夠在不在其系統上安裝ant-contrib的情況下進行構建。

請注意,我定義了一個「ac」XML namespace,所以Ant-Contrib任務不會與其他可能的第三方任務重疊。

3

從ant 1.8開始,對於某些使用案例local任務可能適用。由於屬性是本地化的,因此它以空值開始。它的範圍僅限於當前目標,但您可以在antcall中使用param參數將其傳遞給後續目標。

1

螞蟻一旦設置屬性是不可改變的設計。您可以用提供對ant api的訪問權限的任何腳本語言覆蓋現有屬性,即javascript。
JDK> = 1.6已經附帶了一個JavaScript引擎,所以您可以使用類似:

<project> 

<property name="x" value="whatever"/> 

<script language="javascript"> 
    project.getProperty('x') ? 
    project.setProperty('foo', 'true') : 
    project.setProperty('foo', 'false'); 
</script> 

<echo>$$[foo} => ${foo}</echo> 

</project> 

開箱。
但是,如果有人使用ant -f yourbuild.xml -Dfoo=bla !!作爲userproperties(通過-Dkey = value定義的那些屬性)具有特殊保護。
所以你的要求是「..但是,我不希望用戶能夠從命令行覆蓋條件屬性」。
未填滿。

但是從Ant addon Flakalet任務提供possibillity覆蓋甚至userproperties:

<project xmlns:fl="antlib:it.haefelinger.flaka"> 

<property name="x" value="whatever"/> 

<!-- 
    := defines a new property whereas 
    ::= overwrites any existing property 
    even userproperties 
--> 
<fl:let> foo ::= has.property['x'] ? 'true' : 'false'</fl:let> 

<echo>$$[foo} => ${foo}</echo> 

</project> 

運行都與螞蟻-f yourbuild.xml -Dfoo = BLA腳本,看到了差距。

螞蟻API也有方法project.setUserProperty(字符串,字符串),所以你也可以使用:

... 
<script language="javascript"> 

project.getProperty('x') ? 
    project.setProperty('foo', 'true') : 
    project.setProperty('foo', 'false'); 

project.getUserProperty('x') ? 
    project.setUserProperty('foo', 'true') : 
    project.setUserProperty('foo', 'false'); 

</script> 
... 

防止foo的屬性通過設置.. -D ..它會工作即使屬性x在命令行上定義-Dx = whatever
您必須作出選擇,使用JavaScript開箱即用的腳本任​​務或Flaka讓任務 oneline解決方案,但需要Flaka jar。