mirror of https://github.com/halo-dev/halo
fix: plugin delete lifecycle method will not be triggered when the plugin is uninstalled (#4241)
#### What type of PR is this? /kind bug /kind improvement /area core /milestone 2.8.x #### What this PR does / why we need it: 修复插件被卸载时 delete 生命周期方法不会被触发的问题 how to test it? 1. 测试开发模式下卸载插件,delete 生命周期方法被触发且不会误删项目目录 2. 测试生产模式下插件卸载,文件正确被删除且触发 delete 生命生命周期方法 #### Which issue(s) this PR fixes: Fixes #4238 #### Does this PR introduce a user-facing change? ```release-note 修复插件被卸载时 delete 生命周期方法不会被触发的问题 ```pull/4210/head^2
parent
dc18d287e7
commit
832c86071a
|
@ -712,22 +712,8 @@ public class PluginReconciler implements Reconciler<Request> {
|
||||||
if (pluginWrapper != null) {
|
if (pluginWrapper != null) {
|
||||||
// pluginWrapper must not be null in below code
|
// pluginWrapper must not be null in below code
|
||||||
// stop and unload plugin, see also PluginBeforeStopSyncListener
|
// stop and unload plugin, see also PluginBeforeStopSyncListener
|
||||||
if (!haloPluginManager.unloadPlugin(name)) {
|
if (!haloPluginManager.deletePlugin(name)) {
|
||||||
throw new IllegalStateException("Failed to unload plugin: " + name);
|
throw new IllegalStateException("Failed to delete plugin: " + name);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete plugin resources
|
|
||||||
Path pluginPath = Optional.ofNullable(plugin.statusNonNull().getLoadLocation())
|
|
||||||
.map(URI::getPath)
|
|
||||||
.map(Paths::get)
|
|
||||||
.orElse(null);
|
|
||||||
if (pluginPath != null && isJarFile(pluginPath)) {
|
|
||||||
// delete plugin file
|
|
||||||
try {
|
|
||||||
Files.deleteIfExists(pluginPath);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,11 @@ import org.pf4j.DevelopmentPluginRepository;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* <p>A {@link org.pf4j.PluginRepository} implementation that can add fixed plugin paths for
|
||||||
|
* development {@link org.pf4j.RuntimeMode#DEVELOPMENT}.</p>
|
||||||
|
* <p>change {@link #deletePluginPath(Path)} to a no-op method.</p>
|
||||||
|
* Note: This class is not thread-safe.
|
||||||
|
*
|
||||||
* @author guqing
|
* @author guqing
|
||||||
* @since 2.0.0
|
* @since 2.0.0
|
||||||
*/
|
*/
|
||||||
|
@ -39,4 +44,10 @@ public class DefaultDevelopmentPluginRepository extends DevelopmentPluginReposit
|
||||||
paths.addAll(super.getPluginPaths());
|
paths.addAll(super.getPluginPaths());
|
||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deletePluginPath(Path pluginPath) {
|
||||||
|
// do nothing
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package run.halo.app.plugin;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
|
import org.pf4j.PluginRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link DefaultDevelopmentPluginRepository}.
|
||||||
|
*
|
||||||
|
* @author guqing
|
||||||
|
* @since 2.8.0
|
||||||
|
*/
|
||||||
|
class DefaultDevelopmentPluginRepositoryTest {
|
||||||
|
|
||||||
|
private PluginRepository developmentPluginRepository;
|
||||||
|
|
||||||
|
@TempDir
|
||||||
|
private Path tempDir;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
this.developmentPluginRepository =
|
||||||
|
new DefaultDevelopmentPluginRepository();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void deletePluginPath() {
|
||||||
|
boolean deleted = developmentPluginRepository.deletePluginPath(null);
|
||||||
|
assertThat(deleted).isTrue();
|
||||||
|
|
||||||
|
// deletePluginPath is a no-op
|
||||||
|
deleted = developmentPluginRepository.deletePluginPath(tempDir);
|
||||||
|
assertThat(deleted).isTrue();
|
||||||
|
assertThat(Files.exists(tempDir)).isTrue();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue