我是 IntelliJ 插件开发的新手,想知道如何从我的插件中在命令行中执行命令。
例如,我想调用当前项目根目录中的命令“gulp”。
我已经尝试过使用
Runtime.getRuntime().exec(commands);
使用“cd C:\Users\User\MyProject”和“gulp”等命令,但它似乎不起作用,我想知道插件 API 是否提供了更简单的方法。
我知道有点晚了(一年后),但最近我正在开发一个 IntelliJ 插件,我遇到了同样的问题,这就是我使用的,它运行得很好。
首先,我们需要创建一个需要执行的命令列表:
ArrayList<String> cmds = new ArrayList<>();
cmds.add("./gradlew");
然后
GeneralCommandLine generalCommandLine = new GeneralCommandLine(cmds);
generalCommandLine.setCharset(Charset.forName("UTF-8"));
generalCommandLine.setWorkDirectory(project.getBasePath());
ProcessHandler processHandler = new OSProcessHandler(generalCommandLine);
processHandler.startNotify();
因此
generalCommandLine.setWorkDirectory
设置为项目目录,相当于终端命令 cd path/to/dir/
Runtime 类提供 exec(String[], String[], File) 方法,其中最后一个参数是正在启动的子进程的工作目录。
插件 API 提供 OSProcessHandler 类(以及其他类,如 ProcessAdapter),可以帮助管理子进程,处理其输出等。
ProcessOutput result1 = ExecUtil.execAndGetOutput(generalCommandLine);
result1.getStdOut
result1.getStdErr
有效
和
ScriptRunnerUtil.getProcessOutput(generalCommandLine, ScriptRunnerUtil.STDOUT_OUTPUT_KEY_FILTER, timeout);
两者都工作得很好 它们内置于 intellij
import com.intellij.execution.process.ScriptRunnerUtil;
import com.intellij.execution.util.ExecUtil;
如果您尝试运行的命令是 Gradle 任务,您还可以使用以下 (Kotlin) 代码:
val myProject = project
if (myProject != null){
val gradleId = ProjectSystemId("GRADLE")
val settings = ExternalSystemTaskExecutionSettings()
settings.externalProjectPath = myProject.basePath
settings.taskNames = listOf(gradleTask) // e.g. "generateResourceAccessorsForCommonMain"
settings.vmOptions = ""
settings.externalSystemIdString = gradleId.getId()
ExternalSystemUtil.runTask(
/* taskSettings = */ settings,
/* executorId = */ DefaultRunExecutor.EXECUTOR_ID,
/* project = */ myProject,
/* externalSystemId = */ gradleId,
/* callback = */ null,
/* progressExecutionMode = */ ProgressExecutionMode.IN_BACKGROUND_ASYNC,
/* activateToolWindowBeforeRun = */ false
)
}