2016-12-15 3 views
2

Есть ли способ повторного использования внешних свойств в пользовательском initscript блоке внутри init.gradle?Gradle Стартового скрипта свойств блока

def REPO_URL = 'myRepoUrl' 

initscript { 
    repositories { 
     maven { 
      url REPO_URL 
     } 
    } 
    dependencies { 
     classpath 'some dependency' 
    } 
} 

Это дает мне неизвестную ошибку свойства. Я также пробовал использовать ext {} так

ext { 
    REPO_URL = 'myRepoUrl' 
} 

с той же ошибкой. Тем не менее он работает во всех других конфигурационных блоках, которые я пробовал до сих пор даже внутри init.gradle. Это заставляет меня дублировать свойства для блока initscript и остальной части конфигурации.

После немного более осмотра, похоже, что он полностью лишен ссылки на окружающий объем. Я даже не понимаю, почему он ведет себя таким образом с точки зрения Groovy.

ответ

1

Я думаю, что проблема - это курица и яйцо.

Для выполнения сценария инициализации необходимы зависимости, которые вы указали в блоке initscript. Но вы пытаетесь использовать что-то, что присутствует только во время выполнения скрипта init.

Так что я бы сказал, что вы не хотите. Вы должны объявить это как минимум дважды, внутри блока initscript и снаружи. Поэтому лучше всего вы можете получить:

def REPO_URL = 'myRepoUrl' 

initscript { 
    def REPO_URL = 'myRepoUrl' 
    repositories { 
     maven { 
      url REPO_URL 
     } 
    } 
    dependencies { 
     classpath 'some dependency' 
    } 
} 
+0

Значит ли это, что Gradle каким-то образом компилирует и выполняет метод initscript без выполнения окружения? Я редко отношусь к Gradle и Groovy и не знал, что это возможно. –

+0

Вы можете подключиться к процессу компиляции Groovy и преобразовать скрипты Groovy, прежде чем они будут скомпилированы со стандартным компилятором. Одна из этих трансформаций в этом случае должна заключаться в том, что блок 'initscript' извлекается и оценивается до остальной части сценария, так как остальная часть скрипта нуждается в зависимостях, которые вы объявляете в этом блоке в своем пути к классам, для выполнения, иначе вы получите компилировать ошибки, поскольку зависимости не находятся в пути к классам. Как я сказал, курица и яйцо. :-) – Vampire

+0

Отличный ответ на ссылку в комментарий, чтобы коллеги не спрашивали, почему я дублировал этот кусок кода. –

1

В вашем GRADLE_HOME или PROJECT_HOME у вас может быть 2 файла.

gradle.properties для свойств

init.gradle для инициализации сценария

В gradle.properties вы можете добавить свои Params

REPO_URL=myRepoUrl 

Тогда в init.gradle вы можете использовать его:

repositories { 
     maven { 
      url REPO_URL 
     } 
    } 
+0

Может ли gradle.properties перейти в $ USER_HOME/.gradle? –

+1

yes, gradle.properties можно поместить в project_home или user_home – marok

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