Плагин Gradle SSH, копирующий родительскую папку, а не только файлы

Я использую этот плагин 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,

Как я могу скопировать СОДЕРЖАНИЕ одного каталога (не самого каталога) в целевой каталог при сохранении структуры папок?

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/')}

Вы могли бы создать 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/*.*'
// ...

Вы можете добавить шаблон для копирования всех файлов в папке:

put from: 'build/app/*', into: '/opt/nginx/latest/html/'
Другие вопросы по тегам