2015-04-15 3 views
2

Я пытаюсь запустить сборку apro gradle andrpod из скрипта perl на сервере. Я пробовал различные решения, например:Запустить град из скрипта perl

my $path = Cwd::cwd(); 
$build_output = `cd $appFolder && ./gradlew assembleRelease | cd $path`; 

Я попытался использовать систему и открыть трубку, но результат тот же.

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

Любые идеи о том, что может быть по-разному в вызове градации?

EDIT:

перенаправлять STDERROR и выполнив следующую команду:

my $build_output = `cd $appFolder && pwd && ./gradlew assembleRelease 2>&1`; 
my $err = $? >> 8; 
if ($?) { 
    print LOG "\n\n BUILD ERROR: \n\n$err\n$build_output\n"; 
} else { 
    print LOG "\n\n BUILD OUTPUT: \n\n$build_output\n"; 
} 

Я получаю следующее сообщение об ошибке:

BUILD ERROR: 
/var/www/html/upload/myApp 
1 
Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: /var/www/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcssdffbq9klf8imrndn/gradle-2.2.1-all.zip.lck (No such file or directory) 
    at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78) 
    at org.gradle.wrapper.Install.createDist(Install.java:47) 
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129) 
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48) 
Caused by: java.io.FileNotFoundException: /var/www/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcssdffbq9klf8imrndn/gradle-2.2.1-all.zip.lck (No such file or directory) 
    at java.io.RandomAccessFile.open(Native Method) 
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:241) 
    at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:49) 
    ... 3 more 

Так что мне нужно, чтобы понять, почему он ищет. gradle/folder внутри/var/www вместо папки I chdir. Я попытался установить переменную GRADLE_USER_HOME в/usr/local/gradle, но она по-прежнему ищет /var/www/.gradle/.

решаемые

Причина, почему он искал .gradle в/вар/WWW происходит потому, что скрипт запускается пользователем апача. Перемещение папки там и предоставление доступа решило проблему.

+1

Вам не нужно «chdir» снова - все вызовы оболочки открывают подоболочку, и вы не можете повлиять на среду родителя (или cwd) из подоболочки. – Sobrique

ответ

1

Вам не нужно возвращать chdir - все вызовы оболочки открывают подоболочку, и вы не можете повлиять на среду родителя (или cwd) из подоболочки.

Кроме того, даже если вы действительно хотите это сделать, вам нужно будет ||, а не |, потому что в противном случае вы передаете вывод в 'cd', что почти наверняка не то, что вы хотите сделать.

Итак:

$build_output = `cd $appFolder && ./gradlew assembleRelease`; 

Если делать правильные вещи.

Если нет, то единственное, что я могу думать:

  • Он ожидает STDIN быть подключен. (Методы обхода включают IPC::Open2).
  • Он пытается открыть окно, и нет оконного менеджера.

EDIT

перенаправлять STDERROR и выполнив следующую команду:

my $build_output = `cd $appFolder && pwd && ./gradlew assembleRelease 2>&1`; 
my $err = $? >> 8; 
if ($?) { 
    print LOG "\n\n BUILD ERROR: \n\n$err\n$build_output\n"; 
} else { 
    print LOG "\n\n BUILD OUTPUT: \n\n$build_output\n"; 
} 

Я получаю следующее сообщение об ошибке:

BUILD ERROR: 
/var/www/html/upload/myApp 
1 
Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: /var/www/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcssdffbq9klf8imrndn/gradle-2.2.1-all.zip.lck (No such file or directory) 
    at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78) 
    at org.gradle.wrapper.Install.createDist(Install.java:47) 
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129) 
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48) 
Caused by: java.io.FileNotFoundException: /var/www/.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcssdffbq9klf8imrndn/gradle-2.2.1-all.zip.lck (No such file or directory) 
    at java.io.RandomAccessFile.open(Native Method) 
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:241) 
    at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:49) 
    ... 3 more 

Так что мне нужно, чтобы понять, почему он ищет .gradle/folder внутри/var/www вместо папки I chdir. Он может быть связан с переменной GRADLE_USER_HOME.

+0

спасибо за подсказку, труба и второй диск действительно не нужны, но результат все тот же. конструкция gradle не запрашивает ввода пользователя, поэтому я не думаю, что она может ожидать STDIN, а команда запускается на оболочке без открытия окон. – ascallonisi

+1

В этом случае я попробую проверить '$?', Чтобы увидеть код возврата. Я полагаю, что '$ appFolder' - это абсолютный путь, или тот, который находится под« cwd »? – Sobrique

+0

Извините, я отредактировал ваш комментарий вместо моего оригинального. – ascallonisi

Смежные вопросы