Плагины в мультипроекте не работают в Grails 3.2.11

Конфигурация

Следуя разделу Подключаемые модули и многопроектные сборки в Grails 3.2. 11, предполагается, что я могу настроить мультипроект с помощью следующих команд в терминале:

echo "Creating the root folder..."
mkdir test-multi-project
cd test-multi-project

echo "Creating the settings.gradle file..."
echo "include 'myapp', 'myplugin'" >> settings.gradle

echo "Creating the Grails application..."
grails create-app myapp

echo "Creating the Grails plugin..."
grails create-plugin myplugin

echo "Configuring the dependency between the application and the plugin..."
echo "grails { plugins { compile project(':myplugin') } }" >> myapp/build.gradle 

echo "Executing the Grails application..."
cd myapp
grails run-app 

Ошибка

Однако, когда я попробовал эти команды для создания и настройки приложения Grails и плагина, команда grails run-app выдает следующую ошибку:

FAILURE: Build failed with an exception.

* Where:
Build file '~/test-multi-project/myapp/build.gradle' line: 61

* What went wrong:
A problem occurred evaluating root project 'myapp'.
> Project with path ':myplugin' could not be found in root project 'myapp'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

CONFIGURE FAILED

Total time: 4.835 secs
| Error Error initializing classpath: Project with path ':myplugin' could not be found in root project 'myapp'. (Use --stacktrace to see the full trace)

Дополнительная информация

Я уже тестировал приведенные выше команды с помощью Grails 3.2.8, 3.2.9, 3.2.10 и 3.2.11, и код выдает ту же ошибку.

С другой стороны, я протестировал приведенные выше команды с помощью Grails 3.2.3, 3.2.5 и 3.2.7, и проект выполняется нормально. Кроме того, на целевой странице Grails показано, что приложение использует mypluin.

Обратите внимание: я использую sdk для обработки версий Grails. Команды выполнялись с использованием Java 1.7 и Yosemite:

  • Заводной: 2.4.7
  • Ant: Apache Ant(TM) версии 1.9.6, скомпилированный 29 июня 2015 г.
  • JVM: 1.7.0_141 (Azul Systems, Inc. 24.141-b11)
  • ОС: Mac OS X 10.10.5 x86_64

Вопрос:

Мне интересно, что еще мне нужно сделать или что я делаю неправильно, чтобы этот код работал на Grails 3.2.11.

Заранее спасибо.


person esalomon    schedule 14.07.2017    source источник


Ответы (2)


Джефф Браун исправил указанную выше проблему, удалив файл multi-project-test2/myapp/settings.gradle и добавив следующую строку в файл multi-project-test2/settings.gradle:

project(':myapp').name = 'myapp'

Как вы можете видеть в следующем коммите GitHub: esalomon/multi-project-test2/commit/d92c3fbc67156bcd1af9f47dc6f2984534154bad

После вышеуказанного обновления можно загрузить multi-project-test2, и он будет работать нормально. .

person esalomon    schedule 26.09.2017

Вероятно, что-то пошло не так примерно в этот момент:

echo "grails { plugins { compile project(':myplugin') } }" >> myapp/build.gradle 

Этот сегмент необходимо добавить в существующий блок этого файла, а не в новый блок (не то, что я тестировал)

Что происходит, когда вы выполняете шаги вручную? работает ли это таким образом, и если да, то думали ли вы о том, чтобы сделать diff между файлами, которые изменяются, чтобы увидеть, что отличается.

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

Вы должны изучить ed Что-то вроде этого примера:

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

   runtime "com.h2database:h2"
    testCompile "org.grails:grails-plugin-testing"
    testCompile "org.grails.plugins:geb"
    testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
    testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"

Теперь, если я выполню

test328$ ed -s build.gradle <<EOF >/dev/null
g/^    testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"
a
compile project(':myplugin') 
.
w
q
EOF

теперь вы можете увидеть:

tail -n20 build.gradle 
    runtime "com.h2database:h2"
    testCompile "org.grails:grails-plugin-testing"
    testCompile "org.grails.plugins:geb"
    testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
    testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"
compile project(':myplugin') 
}

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

Сценарий ed использовался для демонстрации этого, так как очевидно, что ранее он был недостаточно ясен.

person V H    schedule 14.07.2017
comment
Боюсь, я не понимаю, что вы пытаетесь сказать. Для пояснения: вместо использования команды echo "grails { plugins { compile project(':myplugin') } }" >> myapp/build.gradle вы можете открыть myapp/build.gradle и добавить определение замыкания для настройки плагина. - person esalomon; 16.07.2017
comment
верно, но я пытался помочь вам использовать ed для автоматизации этой части, и, поскольку это не имело для вас смысла, я обновил ответ, указав, что это именно то, что вам нужно сделать - очевидно, измените :htmlunit:2.18 все это и даже фактическая строка, соответствующая строке, которую вы хотите добавить, чтобы добавить дополнительные пробелы в строке после a, чтобы соответствовать вашему файлу и т. д. - person V H; 16.07.2017
comment
закрытие уже существует, поэтому вы добавляете существующее закрытие, а не добавляете новый блок. Указывает ли документация, что вы должны добавить совершенно новое закрытие, или когда вы добавляете новый плагин, вы затем создаете новое закрытие для каждого плагина или вы добавляете существующий блок, вы еще не видите, где вы ошиблись? - person V H; 16.07.2017
comment
Хорошо, во-первых, большое спасибо за ваш ответ. Во-вторых, я немного больше изучил это, и теперь я лучше понял, о чем вы говорите. Однако кажется, что этот ответ не отвечает на вопрос. Вот в чем дело, команда echo создает раздел Grails для ссылки на плагин, это действительно в соответствии с документацией Grails. Как вы сказали, в файле уже есть раздел зависимостей. Есть отличия, если зависимость размещена там, несмотря на это, я уже пробовал размещать там ссылку на плагин, и это не сработало. - person esalomon; 17.07.2017