android - Gradle 在自定义任务中执行命令行

标签 android gradle gradle-task

在我的 gradle 文件中,我定义了以下任务:

task text_example <<
{
   //?!? commandLine ''
   println 'Fam Flinstone'
}

我想在此任务中放入一些命令行。我该怎么做?

我正在使用库自动在 Google Play 中发布。我的项目基于 Product Flavors,我需要通过命令行为我的每一种口味传递终端命令行。所以我想在 test_example 任务中传递所有命令行。

最佳答案

您基本上有两个主要方便的选择:

  1. 使用 Gradle Exec任务类型

     task fooExec(type: Exec) {
         workingDir "${buildDir}/foo"
         commandLine 'echo', 'Hello world!'
         doLast {
             println "Executed!"
         }
     }
    
  2. 使用 Gradle Project.exec方法

     task execFoo {
         doLast {
             exec {
                 workingDir "${buildDir}/foo"
                 executable 'echo'
                 args 'Hello world!'
             }
             println "Executed!"
         }
     }
    

在这两种情况下,您都可以在闭包内使用 ExecSpec 的方法指定执行参数. 执行命令的标准输出和错误输出将重定向到 gradle 进程的 stdout 和 stderr。

编辑@2022-07-07

下面的评论中提到了一个重要的警告:Gradle 的 exec 不会像 shell(例如 Linux 上的 Bash 或 Windows 上的 CMD)那样评估命令行,它只是使用提供的参数执行指定的可执行文件。

这有一些需要牢记的隐藏后果:

  1. 要执行“命令”,需要指定一个有效的现有可执行文件。

    出现这种情况的最常见情况是尝试使用由 shell 在特定操作系统上实现的“命令”并且没有可执行文件形式的可用实现(例如 echo 和 Windows 上的类似命令)。

  2. 现代 shell 不支持诸如流重定向之类的“奇特”功能(尽管您仍然可以将一个进程的 stdout 重定向到另一个进程的 stdin使用两个单独的 exec 调用和自定义 IO 配置)。

  3. 用户定义的别名(例如在 ~/.bsahrc 中定义)可用。

FIY:实际上不要这样做!

在 Gradle 中“轻松”获得现代 shell 功能的“常见”解决方法是实际运行 shell 进程并提供命令行作为其参数,例如如果使用 Bash:

task shellExec(type: Exec) {
    workingDir "${buildDir}/foo"
    commandLine 'bash', '-c', "echo 'Hello world!'"
}

但是,这种方法会立即将构建脚本绑定(bind)到特定平台,使其无法在没有该特定 shell 的平台上运行(例如,上面的示例将无法在 Windows 上运行)。

关于android - Gradle 在自定义任务中执行命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250735/

相关文章:

android - 在 Gradle 中自动每次构建之前运行清理任务

gradle - 在gradle中制作一个简单的JAR

java - 来自 Api 调用的 Java 中的 Json 建模

android - Picasso 第一次运行不在for循环中调用onBitmapLoaded

android - 如何使用 AppCompat 库在 ActionBar 中显示 NavigationDrawer 图标

java - 仅发布问题|应用程序 :lintVitalRelease

android - 如何用根库打包子项目库

android.media.Ringtone.play() 在播放 28 次后停止工作

spring - 使用Gradle构建Spring-referencePdf任务出错

Android Gradle - 如何在应用程序安装后运行任务