Procházet zdrojové kódy

fix: github issues/5264 代码生成器支持自定义生成文件夹目录

hubin před 2 roky
rodič
revize
8734845fe3

+ 36 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/IOutputFile.java

@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2011-2022, baomidou (jobob@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baomidou.mybatisplus.generator.config;
+
+import java.io.File;
+
+/**
+ * 输出文件接口
+ *
+ * @author hubin
+ * @since 2023-08-04
+ */
+public interface IOutputFile {
+
+    /**
+     * 创建文件
+     *
+     * @param filePath   默认文件路径
+     * @param outputFile 输出文件类型
+     * @return
+     */
+    File createFile(String filePath, OutputFile outputFile);
+}

+ 18 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/StrategyConfig.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.generator.config.po.LikeTable;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.io.File;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -129,6 +130,8 @@ public class StrategyConfig {
 
     private Service service;
 
+    private IOutputFile outputFile = (path, ot) -> new File(path);
+
     /**
      * 实体配置构建者
      *
@@ -365,6 +368,11 @@ public class StrategyConfig {
         return notLikeTable;
     }
 
+    @Nullable
+    public IOutputFile getOutputFile() {
+        return outputFile;
+    }
+
     /**
      * 策略配置构建者
      *
@@ -546,6 +554,16 @@ public class StrategyConfig {
             return this;
         }
 
+        /**
+         * 输出文件处理
+         *
+         * @return this
+         */
+        public Builder outputFile(@NotNull IOutputFile outputFile) {
+            this.strategyConfig.outputFile = outputFile;
+            return this;
+        }
+
         @Override
         @NotNull
         public StrategyConfig build() {

+ 10 - 6
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/engine/AbstractTemplateEngine.java

@@ -93,11 +93,15 @@ public abstract class AbstractTemplateEngine {
         if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(entityPath)) {
             getTemplateFilePath(template -> template.getEntity(getConfigBuilder().getGlobalConfig().isKotlin())).ifPresent((entity) -> {
                 String entityFile = String.format((entityPath + File.separator + "%s" + suffixJavaOrKt()), entityName);
-                outputFile(new File(entityFile), objectMap, entity, getConfigBuilder().getStrategyConfig().entity().isFileOverride());
+                outputFile(getOutputFile(entityFile, OutputFile.entity), objectMap, entity, getConfigBuilder().getStrategyConfig().entity().isFileOverride());
             });
         }
     }
 
+    protected File getOutputFile(String filePath, OutputFile outputFile) {
+        return getConfigBuilder().getStrategyConfig().getOutputFile().createFile(filePath, outputFile);
+    }
+
     /**
      * 输出Mapper文件(含xml)
      *
@@ -112,7 +116,7 @@ public abstract class AbstractTemplateEngine {
         if (StringUtils.isNotBlank(tableInfo.getMapperName()) && StringUtils.isNotBlank(mapperPath)) {
             getTemplateFilePath(TemplateConfig::getMapper).ifPresent(mapper -> {
                 String mapperFile = String.format((mapperPath + File.separator + tableInfo.getMapperName() + suffixJavaOrKt()), entityName);
-                outputFile(new File(mapperFile), objectMap, mapper, getConfigBuilder().getStrategyConfig().mapper().isFileOverride());
+                outputFile(getOutputFile(mapperFile, OutputFile.mapper), objectMap, mapper, getConfigBuilder().getStrategyConfig().mapper().isFileOverride());
             });
         }
         // MpMapper.xml
@@ -120,7 +124,7 @@ public abstract class AbstractTemplateEngine {
         if (StringUtils.isNotBlank(tableInfo.getXmlName()) && StringUtils.isNotBlank(xmlPath)) {
             getTemplateFilePath(TemplateConfig::getXml).ifPresent(xml -> {
                 String xmlFile = String.format((xmlPath + File.separator + tableInfo.getXmlName() + ConstVal.XML_SUFFIX), entityName);
-                outputFile(new File(xmlFile), objectMap, xml, getConfigBuilder().getStrategyConfig().mapper().isFileOverride());
+                outputFile(getOutputFile(xmlFile, OutputFile.xml), objectMap, xml, getConfigBuilder().getStrategyConfig().mapper().isFileOverride());
             });
         }
     }
@@ -141,7 +145,7 @@ public abstract class AbstractTemplateEngine {
             if (StringUtils.isNotBlank(tableInfo.getServiceName()) && StringUtils.isNotBlank(servicePath)) {
                 getTemplateFilePath(TemplateConfig::getService).ifPresent(service -> {
                     String serviceFile = String.format((servicePath + File.separator + tableInfo.getServiceName() + suffixJavaOrKt()), entityName);
-                    outputFile(new File(serviceFile), objectMap, service, getConfigBuilder().getStrategyConfig().service().isFileOverride());
+                    outputFile(getOutputFile(serviceFile, OutputFile.service), objectMap, service, getConfigBuilder().getStrategyConfig().service().isFileOverride());
                 });
             }
         }
@@ -150,7 +154,7 @@ public abstract class AbstractTemplateEngine {
         if (StringUtils.isNotBlank(tableInfo.getServiceImplName()) && StringUtils.isNotBlank(serviceImplPath)) {
             getTemplateFilePath(TemplateConfig::getServiceImpl).ifPresent(serviceImpl -> {
                 String implFile = String.format((serviceImplPath + File.separator + tableInfo.getServiceImplName() + suffixJavaOrKt()), entityName);
-                outputFile(new File(implFile), objectMap, serviceImpl, getConfigBuilder().getStrategyConfig().service().isFileOverride());
+                outputFile(getOutputFile(implFile, OutputFile.serviceImpl), objectMap, serviceImpl, getConfigBuilder().getStrategyConfig().service().isFileOverride());
             });
         }
     }
@@ -169,7 +173,7 @@ public abstract class AbstractTemplateEngine {
             getTemplateFilePath(TemplateConfig::getController).ifPresent(controller -> {
                 String entityName = tableInfo.getEntityName();
                 String controllerFile = String.format((controllerPath + File.separator + tableInfo.getControllerName() + suffixJavaOrKt()), entityName);
-                outputFile(new File(controllerFile), objectMap, controller, getConfigBuilder().getStrategyConfig().controller().isFileOverride());
+                outputFile(getOutputFile(controllerFile, OutputFile.controller), objectMap, controller, getConfigBuilder().getStrategyConfig().controller().isFileOverride());
             });
         }
     }

+ 18 - 0
mybatis-plus-generator/src/test/java/com/baomidou/mybatisplus/generator/samples/H2CodeGeneratorTest.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.generator.query.DefaultQuery;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
+import java.io.File;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -279,6 +280,23 @@ public class H2CodeGeneratorTest extends BaseGeneratorTest {
         generator.execute();
     }
 
+    /**
+     * 测试内置模板路径自定义输出
+     */
+    @Test
+    public void testOutputFile() {
+        AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
+        generator.strategy(strategyConfig().outputFile(((filePath, outputFile) -> {
+            File file = new File(filePath);
+            if(outputFile == OutputFile.controller) {
+                // 调整输出路径为当前目录
+                return new File("." + File.separator + file.getName());
+            }
+            return file;
+        })).build());
+        generator.execute();
+    }
+
     /**
      * 自定义模板(列表)
      */