【问题标题】:How to copy directory via scp within gradle task?如何在 gradle 任务中通过 scp 复制目录?
【发布时间】:2012-10-22 09:58:36
【问题描述】:

使用 Gradle 通过 scp 复制一堆文件的干净优雅的方法是什么?

我目前看到的两种方式是:

有没有更好(更明显)的方法来解决这个问题?

【问题讨论】:

    标签: java groovy gradle scp


    【解决方案1】:

    在最初的问题几年后,我喜欢the Gradle SSH Plugin。其广泛的documentation 的一小段引述:

    我们可以在会话关闭中描述 SSH 操作。

    session(remotes.web01) {
      // Execute a command
      def result = execute 'uptime'
    
      // Any Gradle methods or properties are available in a session closure
      copy {
        from "src/main/resources/example"
        into "$buildDir/tmp"
      }
    
      // Also Groovy methods or properties are available in a session closure
      println result
    }
    

    以下方法在会话关闭中可用。

    • execute - 执行命令。
    • executeBackground - 在后台执行命令。
    • executeSudo - 执行一个支持 sudo 的命令。
    • shell - 执行一个 shell。
    • put - 将文件或目录放入远程主机。
    • get - 从远程主机获取文件或目录。

    ...并允许,例如:

    task deploy(dependsOn: war) << {
      ssh.run {
        session(remotes.staging) {
          put from: war.archivePath.path, into: '/webapps'
          execute 'sudo service tomcat restart'
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      从我使用的一个项目到 SCP 文件到 EC2 服务器。 jar 文件有本地文件,它们是我项目的一部分,我忘记了从哪里得到它们。可能有一种更简洁的方式来完成这一切,但我喜欢在我的构建脚本中非常明确。

      configurations {
        sshAntTask
      }
      
      dependencies {
        sshAntTask fileTree(dir:'buildSrc/lib', include:'jsch*.jar')
        sshAntTask fileTree(dir:'buildSrc/lib', include:'ant-jsch*.jar')
      }
      
      ant.taskdef(
        name: 'scp',
        classname: 'org.apache.tools.ant.taskdefs.optional.ssh.Scp',
        classpath: configurations.sshAntTask.asPath)
      
      task uploadDbServer() {
        doLast  {
          ant.scp(
            file: '...',
            todir: '...',
            keyfile: '...' )
        }
      }
      

      【讨论】:

      • 非常感谢@Shorn 提供了这种简洁明了的方式(并将其放入自己的配置中),我也确实希望这样可以更轻松地进行维护。
      • 这两个工件都可以从 Maven 中心获得。它使配置变得非常容易。
      • 我注意到 Gradle 带有 jsch ......所以没有更好、更 Gradle 的方式来做到这一点吗?
      • 你的依赖可以这样读,来自 maven:sshAntTask 'org.apache.ant:ant-jsch:1.7.1', 'jsch:jsch:0.1.29'
      • @djKianoosh 是的,也许最好把它作为默认答案。对于像我这样的 gradle noobs,它又增加了一个障碍。
      猜你喜欢
      • 2016-03-20
      • 2014-10-19
      • 1970-01-01
      • 2019-04-15
      • 2011-02-19
      • 2011-11-17
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      相关资源
      最近更新 更多