IntelliJ 插件 - 运行控制台命令

问题描述 投票:0回答:4

我是 IntelliJ 插件开发的新手,想知道如何从我的插件中在命令行中执行命令。

例如,我想调用当前项目根目录中的命令“gulp”。

我已经尝试过使用

Runtime.getRuntime().exec(commands);

使用“cd C:\Users\User\MyProject”和“gulp”等命令,但它似乎不起作用,我想知道插件 API 是否提供了更简单的方法。

java intellij-idea console intellij-plugin
4个回答
8
投票

我知道有点晚了(一年后),但最近我正在开发一个 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/


0
投票

Runtime 类提供 exec(String[], String[], File) 方法,其中最后一个参数是正在启动的子进程的工作目录。

插件 API 提供 OSProcessHandler 类(以及其他类,如 ProcessAdapter),可以帮助管理子进程,处理其输出等。


0
投票
 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;

0
投票

如果您尝试运行的命令是 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
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.