Kotlin gradle не понимает, что это проект домой - PullRequest
0 голосов
/ 10 июля 2020

в build.gradle.kts У меня есть

rootProject.name = "adaptors"
// I have also used File("."), same results
file(".").walkTopDown().filter { it.extension == "sln" }.map { it.path.split('/','\\')[1]  }.forEach(::include)

Если я запустил это в kotlinc, он работает, как ожидалось:

>>> File(".").walkTopDown().filter { it.extension == "sln" }.map { it.path.split('/','\\')[1]  }.take(5).forEach{println(it)}
adaptor-cwi_ca_los_angeles
adaptor-socwi_vt
adaptor-qc_oh_butler
adaptor-pwi_tx_mc_tor
adaptor-fdi_globex

Однако, когда я прошу gradle показать мне это проекты:

cbongiorno at 5cg6203867 in ~/dev/adaptors on INIT-471 [!?]

$ gradle projects

> Task :projects

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'adaptors'
\--- Project ':Users'

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :Users:tasks

Ладно, все не так. Но когда я спрашиваю у него свойства, которые он должен показать мне projectDir, это действительно правильно!

cbongiorno at 5cg6203867 in ~/dev/adaptors on INIT-471 [!?]
$ gradle properties

...
projectDir: /Users/cbongiorno/dev/adaptors

Вот bash код, подтверждающий мое понимание:

cbongiorno at 5cg6203867 in ~/dev/adaptors on INIT-471 [!?]
$ pwd
/Users/cbongiorno/dev/adaptors

cbongiorno at 5cg6203867 in ~/dev/adaptors on INIT-471 [!?]
$ ls *.kts
build.gradle.kts    settings.gradle.kts

cbongiorno at 5cg6203867 in ~/dev/adaptors on INIT-471 [!?]
$ ls Users
ls: Users: No such file or directory

Теперь , еще более шокирующим является то, что, если предположить, что это был неправильный родительский элемент, код обхода дерева все равно найдет все файлы решения и ПО-прежнему будет работать правильно. За исключением того, что это вызывает взрыв другого кода, потому что DUH! каталог даже не существует.

У меня точно такая же проблема с windows и ma c.

Итак, как именно Gradle приходит к этим выводам и как это сделать Починить?

1 Ответ

1 голос
/ 11 июля 2020

Короче : он действительно работает с File(".")

Метод Gradle file(Object path) всегда возвращает абсолютный путь к файлу, поскольку любой относительный путь интерпретируется относительно каталога проекта.

Метод Kotlin walkTopDown кажется возвращать относительные пути к файлам, если задан относительный путь ввода, и абсолютные пути к файлам, если задан абсолютный путь ввода. Для относительных путей к файлам it.path.split('/','\\')[1] фактически вернет имя родительского каталога файлов .sln, однако для абсолютных путей к файлам он вернет имя первой папки после файловой системы root (например, Users для /Users/cbongiorno/dev/adaptors). Это причина, по которой Gradle создает подпроект с именем Users.

Gradle не заботится о том, что нет фактического каталога с таким именем, поскольку он также не заботится об отсутствующих или пустых файлах build.gradle. Вы даже можете полностью настроить проект из сценариев сборки других проектов через project(':<path>'), subprojects или allprojects.

...