Зависимости подпроекта в штанах

#python #pants

#python #Брюки

Вопрос:

Я новичок в использовании pantsbuild, и, похоже, я не могу найти никаких хороших вопросов, ответов или документации по моему dillema.

У меня есть проект Pants, который должен быть собран сам по себе. Он имеет свой собственный pants pants.ini файл and, а также все BUILD файлы, содержащие пути относительно корня проекта (где pants.ini есть). Этот проект размещен на GitHub.

Я хотел бы использовать этот проект в качестве зависимости во втором проекте. Для этого я решил использовать подмодули git. Теперь у меня есть макет, подобный следующему:

 path
├── pants
├── pants.ini
├── projectA
│   └── src
│       └── python
|           └── main
│               ├── BUILD
│               └── main.py
└── projectB
    ├── pants
    ├── pants.ini
    └── src
        └── python
            ├── libA
            |   ├── BUILD
            |   └── lib.py
            └── libB
                ├── BUILD
                └── lib.py
 

Естественно, я хочу использовать цели сборки ProjectB из ProjectA, поэтому в ProjectA у BUILD меня есть что-то в этом роде:

 dependencies = [ "projectB/src/python:libA" ]
 

Это все хорошо и хорошо. Однако, поскольку ProjectB является независимым проектом, его src/python/libA/BUILD файл содержит что-то в этом роде:

 dependencies = [ "src/python:libB" ]
 

Из-за этого ProjectB действительно может быть создан независимо. Однако при попытке построить ProjectA цели сборки из поиска ProjectB, начиная с корня проекта ProjectA, например:

 Exception Message: libB was not found in BUILD files from path/src/python
 

Есть ли у pantsbuild какой-либо чистый способ обработки этих зависимостей подпроекта? Или я был бы вынужден изменить файлы сборки подпроекта, чтобы они соответствовали моему макету проекта (в результате чего проект не может быть построен независимо)?

Любые решения или советы приветствуются!

Ответ №1:

Итак, оказывается, что функциональность, на которую я надеялся, не поддерживалась pants. Сначала я последовал совету a Yi Cheng в комментариях и создал скрипт для замены всех правил СБОРКИ подпроекта на те, которые относятся к корневому проекту. Этот скрипт можно найти здесь: https://github.com/brandonio21/pants-subproject-prep

Однако сценарий был довольно ограниченным и был далек от работоспособного решения. С тех пор я изменил pants вверх по течению, чтобы поддерживать поведение. PR был здесь: https://github.com/pantsbuild/pants/pull/4088

Теперь, если у вас есть подпроект в другом проекте pants, создание корневого проекта с --subproject-roots=["path/to/subproject1_root", "path/to/subproject2_root"] помощью (или указание параметра в pants.ini ) создаст подпроект из соответствующего корня подпроекта

Ответ №2:

Это все хорошо и хорошо. Однако, поскольку ProjectA является независимым проектом, его файл src / python / libA / BUILD содержит что-то в этом роде:

зависимости = [ «src/python:libB» ]

iiuc src/python:libB должен быть projectB/src/python:libB . Все целевые пути в репозитории должны быть относительно корня сборки, который находится path в вашем примере.

Комментарии:

1. Это правильно. Для правильной работы проекта ProjectB/src/python/libA/BUILD должен содержать dependencies = [ "projectB/src/python:libB" ]

2. Упс, нажал enter слишком рано. Однако я хочу сказать, что ProjectB — это независимый проект. Я бы хотел, чтобы его можно было создавать самостоятельно, не зная о том, что он находится в другом проекте.

3. Только что заметил, что есть два набора pants и pants.ini , но только один должен быть разрешен в корне сборки. например, в ProjectB вам нужно будет преобразовать целевые пути w.r.t в новый корень сборки. Поведение здесь также странное, потому что pants определяет корень сборки на основе того, где pants находится исполняемый файл.

4. Правильно. Я надеялся, что может быть какой-то способ преодолеть это, тем более, что ProjectB не имеет никаких зависимостей от ProjectA.

5. Я не вижу никаких ярлыков как таковых, но должно быть относительно легко написать скрипт src/python , заменяющий projectB/src/python файлы сборки.