Плагин 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/'