Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
32ea8f52
提交
32ea8f52
authored
4月 09, 2023
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加 Cloud 项目的一键改名
上级
83d2e79f
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
142 行增加
和
0 行删除
+142
-0
ProjectReactor.java
...ateway/src/test/java/cn/iocoder/yudao/ProjectReactor.java
+142
-0
没有找到文件。
yudao-gateway/src/test/java/cn/iocoder/yudao/ProjectReactor.java
0 → 100644
浏览文件 @
32ea8f52
package
cn
.
iocoder
.
yudao
;
import
cn.hutool.core.io.FileTypeUtil
;
import
cn.hutool.core.io.FileUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.common.util.collection.SetUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
java.io.File
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Collection
;
import
java.util.Set
;
import
java.util.regex.Matcher
;
import
java.util.stream.Collectors
;
import
static
java
.
io
.
File
.
separator
;
/**
* 项目修改器,一键替换 Maven 的 groupId、artifactId,项目的 package 等
* <p>
* 通过修改 groupIdNew、artifactIdNew、projectBaseDirNew 三个变量
*
* @author 芋道源码
*/
@Slf4j
public
class
ProjectReactor
{
private
static
final
String
GROUP_ID
=
"cn.iocoder.cloud"
;
private
static
final
String
ARTIFACT_ID
=
"yudao"
;
private
static
final
String
PACKAGE_NAME
=
"cn.iocoder.yudao"
;
private
static
final
String
TITLE
=
"芋道管理系统"
;
/**
* 白名单文件,不进行重写,避免出问题
*/
private
static
final
Set
<
String
>
WHITE_FILE_TYPES
=
SetUtils
.
asSet
(
"gif"
,
"jpg"
,
"svg"
,
"png"
,
// 图片
"eot"
,
"woff2"
,
"ttf"
,
"woff"
);
// 字体
public
static
void
main
(
String
[]
args
)
{
long
start
=
System
.
currentTimeMillis
();
String
projectBaseDir
=
getProjectBaseDir
();
log
.
info
(
"[main][原项目路劲改地址 ({})]"
,
projectBaseDir
);
// ========== 配置,需要你手动修改 ==========
String
groupIdNew
=
"cn.star.gg"
;
String
artifactIdNew
=
"star"
;
String
packageNameNew
=
"cn.start.pp"
;
String
titleNew
=
"土豆管理系统"
;
String
projectBaseDirNew
=
projectBaseDir
+
"-new"
;
// 一键改名后,“新”项目所在的目录
log
.
info
(
"[main][检测新项目目录 ({})是否存在]"
,
projectBaseDirNew
);
if
(
FileUtil
.
exist
(
projectBaseDirNew
))
{
log
.
error
(
"[main][新项目目录检测 ({})已存在,请更改新的目录!程序退出]"
,
projectBaseDirNew
);
return
;
}
// 如果新目录中存在 PACKAGE_NAME,ARTIFACT_ID 等关键字,路径会被替换,导致生成的文件不在预期目录
if
(
StrUtil
.
containsAny
(
projectBaseDirNew
,
PACKAGE_NAME
,
ARTIFACT_ID
,
StrUtil
.
upperFirst
(
ARTIFACT_ID
)))
{
log
.
error
(
"[main][新项目目录 `projectBaseDirNew` 检测 ({}) 存在冲突名称「{}」或者「{}」,请更改新的目录!程序退出]"
,
projectBaseDirNew
,
PACKAGE_NAME
,
ARTIFACT_ID
);
return
;
}
log
.
info
(
"[main][完成新项目目录检测,新项目路径地址 ({})]"
,
projectBaseDirNew
);
// 获得需要复制的文件
log
.
info
(
"[main][开始获得需要重写的文件,预计需要 10-20 秒]"
);
Collection
<
File
>
files
=
listFiles
(
projectBaseDir
);
log
.
info
(
"[main][需要重写的文件数量:{},预计需要 15-30 秒]"
,
files
.
size
());
// 写入文件
files
.
forEach
(
file
->
{
// 如果是白名单的文件类型,不进行重写,直接拷贝
String
fileType
=
FileTypeUtil
.
getType
(
file
);
if
(
WHITE_FILE_TYPES
.
contains
(
fileType
))
{
copyFile
(
file
,
projectBaseDir
,
projectBaseDirNew
,
packageNameNew
,
artifactIdNew
);
return
;
}
// 如果非白名单的文件类型,重写内容,在生成文件
String
content
=
replaceFileContent
(
file
,
groupIdNew
,
artifactIdNew
,
packageNameNew
,
titleNew
);
writeFile
(
file
,
content
,
projectBaseDir
,
projectBaseDirNew
,
packageNameNew
,
artifactIdNew
);
});
log
.
info
(
"[main][重写完成]共耗时:{} 秒"
,
(
System
.
currentTimeMillis
()
-
start
)
/
1000
);
}
private
static
String
getProjectBaseDir
()
{
String
baseDir
=
System
.
getProperty
(
"user.dir"
);
if
(
StrUtil
.
isEmpty
(
baseDir
))
{
throw
new
NullPointerException
(
"项目基础路径不存在"
);
}
return
baseDir
;
}
private
static
Collection
<
File
>
listFiles
(
String
projectBaseDir
)
{
Collection
<
File
>
files
=
FileUtil
.
loopFiles
(
projectBaseDir
);
// 移除 IDEA、Git 自身的文件、Node 编译出来的文件
files
=
files
.
stream
()
.
filter
(
file
->
!
file
.
getPath
().
contains
(
separator
+
"target"
+
separator
)
&&
!
file
.
getPath
().
contains
(
separator
+
"node_modules"
+
separator
)
&&
!
file
.
getPath
().
contains
(
separator
+
".idea"
+
separator
)
&&
!
file
.
getPath
().
contains
(
separator
+
".git"
+
separator
)
&&
!
file
.
getPath
().
contains
(
separator
+
"dist"
+
separator
)
&&
!
file
.
getPath
().
contains
(
".iml"
)
&&
!
file
.
getPath
().
contains
(
".html.gz"
))
.
collect
(
Collectors
.
toList
());
return
files
;
}
private
static
String
replaceFileContent
(
File
file
,
String
groupIdNew
,
String
artifactIdNew
,
String
packageNameNew
,
String
titleNew
)
{
String
content
=
FileUtil
.
readString
(
file
,
StandardCharsets
.
UTF_8
);
// 如果是白名单的文件类型,不进行重写
String
fileType
=
FileTypeUtil
.
getType
(
file
);
if
(
WHITE_FILE_TYPES
.
contains
(
fileType
))
{
return
content
;
}
// 执行文件内容都重写
return
content
.
replaceAll
(
GROUP_ID
,
groupIdNew
)
.
replaceAll
(
PACKAGE_NAME
,
packageNameNew
)
.
replaceAll
(
ARTIFACT_ID
,
artifactIdNew
)
// 必须放在最后替换,因为 ARTIFACT_ID 太短!
.
replaceAll
(
StrUtil
.
upperFirst
(
ARTIFACT_ID
),
StrUtil
.
upperFirst
(
artifactIdNew
))
.
replaceAll
(
TITLE
,
titleNew
);
}
private
static
void
writeFile
(
File
file
,
String
fileContent
,
String
projectBaseDir
,
String
projectBaseDirNew
,
String
packageNameNew
,
String
artifactIdNew
)
{
String
newPath
=
buildNewFilePath
(
file
,
projectBaseDir
,
projectBaseDirNew
,
packageNameNew
,
artifactIdNew
);
FileUtil
.
writeUtf8String
(
fileContent
,
newPath
);
}
private
static
void
copyFile
(
File
file
,
String
projectBaseDir
,
String
projectBaseDirNew
,
String
packageNameNew
,
String
artifactIdNew
)
{
String
newPath
=
buildNewFilePath
(
file
,
projectBaseDir
,
projectBaseDirNew
,
packageNameNew
,
artifactIdNew
);
FileUtil
.
copyFile
(
file
,
new
File
(
newPath
));
}
private
static
String
buildNewFilePath
(
File
file
,
String
projectBaseDir
,
String
projectBaseDirNew
,
String
packageNameNew
,
String
artifactIdNew
)
{
return
file
.
getPath
().
replace
(
projectBaseDir
,
projectBaseDirNew
)
// 新目录
.
replace
(
PACKAGE_NAME
.
replaceAll
(
"\\."
,
Matcher
.
quoteReplacement
(
separator
)),
packageNameNew
.
replaceAll
(
"\\."
,
Matcher
.
quoteReplacement
(
separator
)))
.
replace
(
ARTIFACT_ID
,
artifactIdNew
)
//
.
replaceAll
(
StrUtil
.
upperFirst
(
ARTIFACT_ID
),
StrUtil
.
upperFirst
(
artifactIdNew
));
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论