自定义spring-initializr的工作方式?

时间:2017-04-14 20:33:18

标签: spring spring-boot

作为一家企业,我们希望在我们的PCF实例上内部托管初始化器,我可以这样做。我也能够修改application.yml以默认一些选择。

我通过创建自己的spring-boot应用程序来实现这一点,该应用程序使用io.spring.initializr:initializr-web:0.3.0.RELEASE作为运行时依赖项。

我有两个主要问题:

  1. UI上有没有办法默认选择某些选项 UI首次出现时的依赖性(即预先选择Web& 例如安全性)?
  2. 我可以自定义一代的输出吗?比如我们有 我们自己定制的Gradle发行版,并希望生成 build.gradle文件看起来与initializr有点不同 产生。我们也想生成一个gradle.properties文件 该项目的一部分。

2 个答案:

答案 0 :(得分:4)

walk you through the creation of your own instance的参考指南。关于你的主要问题:

是的,这可以在自定义实例中使用。实现ProjectRequestPostProcessor并将这两个依赖项添加到项目中。

@Component
class PreselectedDependenciesRequestPostProcessor implements ProjectRequestPostProcessor {

    private final InitializrMetadataProvider metadataProvider;

    public PreselectedDependenciesRequestPostProcessor(
            InitializrMetadataProvider metadataProvider) {
        this.metadataProvider = metadataProvider;
    }

    @Override
    public void postProcessAfterResolution(ProjectRequest request,
            InitializrMetadata metadata) {
        DependenciesCapability dependencies = metadataProvider.get().getDependencies();
        if (!hasDependencies(request, "web")) {
            request.getResolvedDependencies().add(dependencies.get("web"));
        }
        if (!hasDependencies(request, "security")) {
            request.getResolvedDependencies().add(dependencies.get("security"));
        }
    }

    private boolean hasDependencies(ProjectRequest request, String... dependenciesId) {
        for (String id : dependenciesId) {
            if (getDependency(request, id) == null) {
                return false;
            }
        }
        return true;
    }

    private Dependency getDependency(ProjectRequest request, String id) {
        return request.getResolvedDependencies().stream()
                .filter(d -> id.equals(d.getId())).findFirst().orElse(null);
    }
}

它们不会在UI中被选中,但它们将以与用户选择它们相同的方式集成到项目中。我推荐这种方法的原因是IDE集成的目标实例可以与main(start.spring.io)实例相同。攻击Web UI只会使这个特定客户端工作,IMO是一个问题。

对于第二个问题,大多数分支从ProjectGenerator延伸并做任何他们想做的事情(包括覆盖gradle构建)。检查该课程了解更多详情。

Spring Initializr尚未达到1.0,所以它还没有处于合同足够成熟的状态。

答案 1 :(得分:1)

我已经为我们的内部用法做了很多这样的工作,并将在明天的gr8conf上发表演讲。

放入自定义文件并添加默认选择非常简单,需要一些修改java,css和html的知识。您可以在此处获取我为完成此演示所做的工作的来源:https://github.com/Grails-Plugin-Consortium/initializr/tree/master

需要更改的代码是冗长的,所以最简单的方法来了解我必须做的工作才能实现这一点,只需链接差异,添加“默认”选项和应用程序配置文件。

https://github.com/Grails-Plugin-Consortium/initializr/commit/feae678fdd4503c2314635cebdaabc04b4d80ace

添加自定义文件以添加到生成的应用程序更容易,只需要将文件添加到initializr-generator中的模板,然后在ProjectGenerator.java中添加链接以复制文件,类似于现有代码的方式已经实施。

protected void generateDockerFile(File dir, Map<String, Object> model){
    write(new File(dir, "Dockerfile"), "Dockerfile", model);
    write(new File(dir, "docker.sh"), "docker.sh", model);
    write(new File(dir, "docker-run.sh"), "docker-run.sh", model);
}

上面添加到ProjectGenerator的方法将添加initializr/initializr-generator/src/main/resources/templates/

中存储的以下文件

这一代的所有繁重工作都存在于此文件中:https://github.com/Grails-Plugin-Consortium/initializr/blob/9b302d31bb069c9c702f36ed765ad3f55debff84/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java