【问题标题】:How do you support a Gradle Exec task for both Mac and PC?您如何支持 Mac 和 PC 的 Gradle Exec 任务?
【发布时间】:2015-02-08 22:41:23
【问题描述】:

如果命令采用不同的形式,有没有办法能够在 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'
}

你会如何在 Gradle 中做到这一点?

【问题讨论】:

    标签: windows macos gradle


    【解决方案1】:

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

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

    【讨论】:

    • 顺便说一句,我发现(至少对于 Windows 8.1)返回的字符串是“Windows 8.1”(大写 W)。因此,您需要使用 .contains('Windows') 甚至更好, System.getProperty('os.name').toLowerCase().contains('windows') 将涵盖大小写差异。
    • 或者你先import org.gradle.internal.os.OperatingSystem; 然后OperatingSystem.current().isWindows()
    • 我建议不要使用内部类,因为它们必然会在没有通知的情况下发生变化。
    • 操作系统 API 现已公开,org.gradle.nativeplatform.platform。见docs.gradle.org/current/javadoc/org/gradle/nativeplatform/…
    • 仅供参考,上面的链接是一个接口。该接口的实现仍然是内部的,因此如果不再次依赖内部类,就无法实际使用它。
    【解决方案2】:

    如果脚本或可执行文件在 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
           }
    

    【讨论】:

    • 我发现这个解决方案更优雅,并且如果完成了多个命令行调用,则可以减少混乱。需要更多点赞!
    【解决方案3】:

    我指的是这里。 https://stackoverflow.com/a/31443955/1932017

    import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
    
    task stopTomcat(type:Exec) {
        if (DefaultNativePlatform.currentOperatingSystem.isWindows()) {
            // use this command line if on Windows
            commandLine 'cmd', '/c', 'stop.cmd'
        } else {
            // use the command line if on Mac
            commandLine './stop.sh'
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2020-06-06
      相关资源
      最近更新 更多