Как параметризовать путь в ANT? - PullRequest
1 голос
/ 24 марта 2010

У меня есть следующее определение в файле с именем build-dependencies.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
  ...
  <path id="common-jars">
    <fileset file="artifacts/project-1/jar/some*.jar" />
    <fileset file="artifacts/project-2/jar/someother*.jar" />
  </path>
  ...
</project>

Я включаю его в начало моего build.xml файла. Теперь мне нужно сделать папку с артефактами параметром, чтобы ее можно было изменять во время выполнения разных целей. Имея это ...

<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
  ...
  <path id="common-jars">
    <fileset file="${artifacts}/project-1/jar/some*.jar" />
    <fileset file="${artifacts}/project-2/jar/someother*.jar" />
  </path>
  ...
</project>

... и определение свойства "артефактов" (и его изменение) в цели не работает, поскольку кажется, что замена свойства происходит, когда путь определен в build-dependencies.xml

Как я могу решить это? Я думал о том, чтобы иметь параметризованный макрос и вызывать его до того, как путь действительно будет использован, но это выглядит не элегантно. Примерно так:

<macrodef name="create-common-jars">
  <attribute name="artifacts"/>
  <sequential>
    <path id="common-jars">
      <fileset file="@{artifacts}/project-1/jar/some*.jar" />
      <fileset file="@{artifacts}/project-2/jar/someother*.jar" />
    </path>
  </sequential>
</macrodef>

РЕДАКТИРОВАТЬ: параметры плюща и командной строки не являются опцией.

Ответы [ 6 ]

3 голосов
/ 30 марта 2010

Вы не хотите параметризованный путь. Вы хотите PatternSet . Вы можете определить набор шаблонов на верхнем уровне, а затем просто обращаться к нему в отдельных целях, когда вам это нужно. Для вашего примера:

<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
  ...
  <patternset id="common-jars">
    <include name="project-1/jar/some*.jar" />
    <include name="project-2/jar/someother*.jar" />
  </patternset>
  ...
  <path id="instrumented-jars">
    <fileset dir="instrumented">
      <patternset refid="common-jars" />
    </fileset>
  </path>
  ...
  <path id="standard-jars">
    <fileset dir="not-instrumented">
      <patternset refid="common-jars" />
    </fileset>
  </path>
  ...
</project>
0 голосов
/ 30 марта 2010

Вы можете сделать это с различными зависимостями:

setpath.xml:

<project name="setpath">
  <target name="setCommonJars">
    <path id="common-jars">
      <fileset file="${param1}/some*.jar" />
      <fileset file="${param1}/someother*.jar" />
    </path>
  </target>
</project>

build.xml:

<project name="Test path" basedir=".">
  <import file="./setpath.xml" />

  <target name="buildT1" depends="setT1,setCommonJars">
    <property name="jar-str" refid="common-jars" />
    <echo message="buildT1: ${jar-str}" />
  </target>

  <target name="buildT2" depends="setT2,setCommonJars">
    <property name="jar-str" refid="common-jars" />
    <echo message="buildT2: ${jar-str}" />
  </target>

  <target name="setT1">
    <property name="param1" value="t1" />
  </target>

  <target name="setT2">
    <property name="param1" value="t2" />
  </target>

</project>

Если вы вызываете целевой buildT1, то будет использоваться каталог t1, если вы вызываете buildT2, будет использоваться каталог t2.

0 голосов
/ 30 марта 2010

ОК, я думаю, что для меня нет другого очевидного способа сделать то, что я пытаюсь сделать, кроме использования макроса, который принимает параметр и создает путь с соответствующей папкой артефактов.

Чтобы дать немного контекста, почему я пытался получить то, что хотел, это иметь «инструментальные» и «неинструментированные» артефакты в отдельных папках. И в своих «целях» я мог просто изменять режим артефактов. Итак, теперь у меня есть макрос: <initialise-build-settings artifacts-mode="instrumented" />, который устанавливает все пути и другие переменные.

Спасибо за ваши ответы, ребята.

0 голосов
/ 29 марта 2010

является ли использование переменных среды опцией (если они установлены при запуске eclipse, они будут выбраны)? Если это так, попросите каждого установить ARTIFACTS, и это должно работать:

<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
  <property environment="env"/>
  <path id="common-jars">
    <fileset file="${env.ARTIFACTS}/project-1/jar/some*.jar" />
    <fileset file="${env.ARTIFACTS}/project-2/jar/someother*.jar" />
  </path>
</project>
0 голосов
/ 24 марта 2010

Я бы рекомендовал использовать ivy для управления зависимостями пути к классам. У Ivy есть аккуратная концепция, называемая конфигурациями, которая позволяет группировать коллекции артефактов в зависимости от их использования.

Вот адаптация одного из моих собственных файлов сборки:

<target name="retrieve" description="3rd party dependencies">
    <ivy:resolve/>

    <ivy:cachepath pathid="build.path" conf="build"/>
    <ivy:cachepath pathid="runtime.path" conf="runtime"/>
</target>

Конфигурации управляются в файле ivy.xml (заменит файл build-dependencies.xml )

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="HelloWorld"/>

    <configurations>
        <conf name="build" description="jars needed for build" />
        <conf name="runtime" extends="build" description="jars needed at runtime" />
    </configurations>

    <dependencies>
        <dependency org="org1" name="project1" rev="1.0" conf="build->default"/>
        <dependency org="org2" name="project2" rev="1.0" conf="build->default"/>
        <dependency org="org3" name="project3" rev="1.0" conf="runtime->default"/>
        <dependency org="org4" name="project4" rev="1.0" conf="runtime->default"/>
    </dependencies>
</ivy-module>

Артефакты jar, связанные с каждым проектом, будут автоматически загружаться и кэшироваться из онлайн-хранилищ maven, или вы можете создать свой собственный локальный репозиторий для хранения коллекций локальных артефактов.

0 голосов
/ 24 марта 2010

Позволяет вызвать ваш файл build.xml. Таким образом, вы выполняете это, запустив команду ant. В первом случае имена артефактов жестко закодированы в свойстве, указанном в третьей строке ниже

<?xml version="1.0" encoding="UTF-8"?>
<project name="build-dependencies">
<property name="artifacts" value="first-value" />
  ...
  <path id="common-jars">
    <fileset file="artifacts/project-1/jar/some*.jar" />
    <fileset file="artifacts/project-2/jar/someother*.jar" />
  </path>
  ...
</project>

Теперь, когда вы хотите изменить его и использовать другое значение для этого свойства артефактов, мы запускаем скрипт таким образом

ant -Dartifacts=new-value

Это заменит значение жестко закодированных артефактов в build.xml

Если вы работаете с целевыми объектами ant, вы можете сделать что-то похожее, в целевой строке в первой строке укажите свойство и, если вы хотите перезаписать значение по умолчанию, передайте свойство в качестве параметра при вызове этой цели. *

Ваш комментарий напомнил мне что-то еще. Пусть ваши разработчики создадут файл artifacts-dir-name.xml. Он будет иметь только одну строку:

<?xml version="1.0" encoding="UTF-8"?>
<project name="artifacts-file">
<property name="artifacts" value="new-value" />
</project>

Теперь в вашем файле build.xml перед строкой, в которой определено свойство артефактов, импортируйте этот файл следующим образом:

<import file="artifacts-dir-name.xml" optional="true" />

Теперь в Eclipse, если этот файл существует, свойство считывается из него, и артефакты устанавливаются в «новое значение», в противном случае свойство читается из build.xml и устанавливается в «первое значение». Все, что нужно сделать разработчикам, - убедиться, что в этом каталоге существует файл artifacts-dir-name.xml. Это может работать и в Eclipse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...