Установка переменной среды PATH в ant build.xml работает на cygwin, но не на cmd или PowerShell.

Я пытался установить переменную среды PATH в файле ant build.xml через этот ответ.

Он работает на cygwin, но не на cmd или PowerShell.

Немного информации:

Apache Ant 1.6.5 (я знаю, что есть более новая версия (1.8.4), но по внутренним причинам я должен использовать эту более старую версию)

Powershell v2.0

cmd v6.1.7601

сигвин 2.774

Windows 7


person coelhudo    schedule 04.07.2012    source источник
comment
вы пытаетесь использовать задачу exec?   -  person pb2q    schedule 05.07.2012
comment
Да, так же, как и в этом вопросе stackoverflow.com/q/5607580/174605   -  person coelhudo    schedule 05.07.2012


Ответы (2)


Возможно, вам придется использовать задачу exec немного по-другому в средах Windows/cmd.

Давайте использовать команду Windows set в качестве примера. set будет печатать переменные среды. Обычная задача exec, выполняющая команду set, может выглядеть так:

<exec executable="set" outputproperty="set.output">
    <env key="MY_VAR" value="MY_VAL"/>
    <echo message="${set.output}"/>
</exec>

Но использование этой формы задачи exec должно вызвать исключение IOException: Система не может найти указанный файл.

При запуске ant в командной оболочке Windows задача exec также может быть вызвана через cmd, например:

<exec executable="cmd" outputproperty="set.output">
    <arg line="/c set"/>
    <env key="MY_VAR" value="MY_VAL"/>
    <echo message="${set.output}"/>
</exec>

Это эквивалентная команда; фактическая выполняемая команда - cmd /c set, которая выполняется set в подпроцессе cmd.

Причина, по которой это необходимо, лишь немного сложна и связана со способом расположения команд в Win32 ::CreateProcess. Это кратко поясняется в документах по ant exec.

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

В моих собственных сценариях сборки ant у меня обычно есть две версии каждой цели, которые требуют специальной обработки для платформ Windows, с тестом isWindows, который выглядит следующим образом:

<target name="check-windows">
    <condition property="isWindows">
        <os family="windows"/>
    </condition>
</target>

Затем я могу переключаться между версиями одной и той же задачи, используя:

<target name="my-target-notwindows" depends="check-windows" unless="isWindows>
    ...
</target>

<target name="my-target-windows" depends="check-windows" if="isWindows>
    ...
</target>

<target name="my-target" depends="my-target-notwindows,my-target-windows">
    ...
</target>
person pb2q    schedule 04.07.2012

К сожалению, была ошибка муравья, связанная с версией 1.6.5. Я смог обновиться до 1.8.4 и все работает нормально.

person coelhudo    schedule 05.07.2012