我正在使用Kotlin便携式DSL配置TeamCity 2018.1实例。当我从TeamCity Web UI导出DSL时,我的项目结构如下:
<Root>
|- Project A
|- Project B
这给了我一个看起来像这样的文件系统结构:
.teamcity
|- _Self
|- project.kts
|- Project A
|- project.kts
|- Project B
|- project.kts
|- settings.kts
当前,加载子项目时有静态引用,类似于此
import Project_A.*
// …
subProject(Project_A.Project)
subProject(Project_B.Project)
我想修改Root settings.kts文件,以便可以动态加载项目。我正在尝试:
version = "2018.1"
project {
subProject {
id("Root")
name = "Root"
for(project in arrayListOf("Project_A.Project", "Project_B.Project")) {
val subProj = Class.forName("$project").getConstructor().newInstance() as Project
subProject(subProj)
}
}
}
但是,此操作失败并显示:
_Root: java.net.URLClassLoader [381]:
java.lang.ClassNotFoundException: Project_A
为什么会失败?
答案 0 :(得分:1)
另一个选项,而不是调用subProject()
是在每个子项目目录中创建settings.kts
文件。
您可以在当前的settings.kts中找到此评论:
子项目可以在自己的settings.kts中定义,也可以通过 在该项目中调用subProjects()方法。
我不确定您为什么要“动态”执行此操作。您的示例具有硬编码名称。
如果您确实出于某种原因需要动态创建子项目关系 您可以动态创建那些.kts文件