你如何支持Mac和PC的Gradle Exec任务?

Ken*_*Ken 23 windows macos gradle

如果命令采用不同的形式,是否有办法在Windows和Mac上执行任务?例如:

task stopTomcat(type:Exec) {

    // use this command line if on Windows
    commandLine 'cmd', '/c', 'stop.cmd'

    // use the command line if on Mac
    commandLine './stop.sh'
}
Run Code Online (Sandbox Code Playgroud)

你会怎么在Gradle做到这一点?

Mar*_*ira 39

您可以commandLine根据系统属性的值有条件地设置属性.

if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
    commandLine 'cmd', '/c', 'stop.cmd'
} else {
    commandLine './stop.sh'
}
Run Code Online (Sandbox Code Playgroud)

  • 或者你执行`import org.gradle.internal.os.OperatingSystem;`然后`OperatingSystem.current().isWindows()` (7认同)
  • 顺便说一句,我发现(至少对于Windows 8.1而言)返回的字符串是“ Windows 8.1”(大写W)。因此,您需要使用.contains('Windows')或什至更好,System.getProperty('os.name')。toLowerCase()。contains('windows')将解决大小写差异。 (2认同)
  • 我建议不要使用内部类,因为它们必然会在没有通知的情况下发生变化. (2认同)
  • OperatingSystem API现在是公共的,`org.gradle.nativeplatform.platform`.请参阅https://docs.gradle.org/current/javadoc/org/gradle/nativeplatform/platform/OperatingSystem.html (2认同)
  • 仅供参考,上面的链接是一个界面.该接口的实现仍然是内部的,因此没有办法实际使用它而不依赖于内部类. (2认同)

bit*_*ock 7

如果脚本或可执行文件在 windows 和 linux 上相同,那么您将能够执行以下操作,以便您只需通过调用如下函数来定义参数一次:

       import org.apache.tools.ant.taskdefs.condition.Os       

       task executeCommand(type: Exec) {    
            commandLine osAdaptiveCommand('aws', 'ecr', 'get-login', '--no-include-email')
       }

       private static Iterable<String> osAdaptiveCommand(String... commands) {
            def newCommands = []
            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                newCommands = ['cmd', '/c']
            }

            newCommands.addAll(commands)
            return newCommands
       }
Run Code Online (Sandbox Code Playgroud)

  • 如果完成了多个命令行调用,我发现这个解决方案更优雅,并且可以减少混乱。需要更多点赞! (2认同)