有一个 README.md 文件,其中包含转换为 pom.xml 文件值的各种文本占位符。该文件位于路径上{project.basedir}/doc/README.md,并且在构建项目时,它由maven-resources-plugin 插件处理,该插件将文本占位符转换并将其复制到项目根目录,并在下一步中复制到目标目录(所以它也在 JAR 根目录中):
README.md 文件的内容示例:
# ${project.name}
${project.description}
[[_TOC_]]
## Used Maven Dependencies
- [JUnit](https://junit.org/junit5/docs/${junit}/api/) v.${junit}
- [SELF4J](https://www.javadoc.io/static/org.slf4j/slf4j-api/${slf4j}/index.html) v.${slf4j}
- ...
## Build
Compiled and built at ${timestamp} with:
- Java: ${java.version}
- Maven: ${maven.version}
```xml
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</dependency>
```
在 pom.xml 文件中,处理配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<!-- ... -->
<properties>
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
<!-- ... -->
</properties>
<!-- ... -->
<build>
<!-- ... -->
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>replace-placeholders-in-readme</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/doc</directory>
<includes>
<include>README.md</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<encoding>UTF-8</encoding>
</configuration>
</execution>
<execution>
<id>copy-readme-to-output</id>
<phase>compile</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}</directory>
<includes>
<include>README.md</include>
</includes>
</resource>
</resources>
<encoding>UTF-8</encoding>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
问题在于,为了执行所有这些转换,必须通过 maven(例如mvn verify)在本地机器上构建,因为 否则,修改后的 README.md 文件将出现在程序集/JAR 文件中,但不在存储库中。例如,在 pom.xml 中某个依赖项的版本发生了变化,而在 README.md 文件中使用了旧版本/引用。
问题:是否有可能以任何方式配置 README.md 文件的自动生成,即使在本地机器上,甚至在 GitLab 端(在 gitlab-ci.yml 中注册)?理想情况下,我们希望在每次提交时生成一个文件并自动将其“推送”到存储库中。
由于文件在编译时更改并且测试在之后运行,因此测试将检查更改。您可以使用 git 工具
git diff --exit-code README.md,找出是否对文件进行了更改,如果是,则抛出错误并编写相应的消息。例子:
可以在脚本中编写类似的检查,作为 CI 的单独步骤。