2

我正在使用这个 Gradle SSH 插件。它有一种方法put可以将文件从我的本地机器移动到会话所连接的机器上。

我的应用程序已完全构建并存在于build/app其中,我正在尝试将其移动到/opt/nginx/latest/html/该文件build/app/index.html将存在于/opt/nginx/latest/html/index.html其中并且任何子文件夹build/app也被复制的位置。

我的 build.gradle:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'org.hidetake:gradle-ssh-plugin:1.1.4'
  }
}

apply plugin: 'org.hidetake.ssh'

remotes {
  target {
    host = '<my target vm>'
    user = 'user'
    password = 'pass'
  }
}

...

task deploy() << {
  ssh.run {
    session(remotes.target) {
      put from: 'build/app/', into: '/opt/nginx/latest/html/'
    }
  }
}

正如我上面所说,它将所有文件放入/opt/nginx/latest/html/app. 如果我更改from为使用,fileTree(dir: 'build/app')那么所有文件都会被复制,但我会丢失文件结构,即被build/app/scripts/main.js复制到/opt/nginx/latest/html/main.js而不是预期的/opt/nginx/latest/html/scripts/main.js.

如何在保留文件夹结构的同时将一个目录(不是目录本身)的内容复制到目标目录中?

4

3 回答 3

3

查看插件的代码,它说:

    static usage = '''put() accepts following signatures:
        put(from: String or File, into: String)  // put a file or directory
        put(from: Iterable<File>, into: String) // put files or directories
        put(from: InputStream, into: String)     // put a stream into the remote file
        put(text: String, into: String)          // put a string into the remote file
        put(bytes: byte[], into: String)         // put a byte array into the remote file'''

您正在使用选项 #1 来提供一个File(也可以是一个目录),而您应该使用 #2,这将是一个可迭代build/app的子级列表。所以我会尝试:

put (from: new File('build/app').listFiles(), into: '/opt/nginx/latest/html/')

编辑:或者,

new File('build/app').listFiles().each{put (from:it, into:'/opt/nginx/latest/html/')}
于 2016-01-12T21:22:52.867 回答
2

您可以为您的目录创建一个FileTree对象build/app,然后将您的整个树结构 ssh 到您的远程实例:

FileTree myFileTree = fileTree(dir: 'build/app')

task deploy() << {
  ssh.run {
    session(remotes.target) {
      put from: myFileTree.getDir(), into: '/opt/nginx/latest/html/'
    }
  }

它应该复制您的结构和文件,例如:

// 'build/app'         -> '/opt/nginx/latest/html/
// 'build/app/scripts' -> '/opt/nginx/latest/html/scripts/'
// 'build/app/*.*'     -> 'opt/nginx/latest/html/*.*'
// ...
于 2017-03-17T13:16:54.570 回答
0

您可以添加通配符来复制文件夹中的所有文件:

put from: 'build/app/*', into: '/opt/nginx/latest/html/'
于 2016-01-12T20:24:16.510 回答