我需要添加到gradle构建脚本一个命令,将创建一个符号链接。我知道构建它的人已经安装了cygwin。问题在于导出命令。这是我目前得到的
if(OS == 'win32') {
exec { commandLine "C:\cygwin\bin\mintty.exe", "--hold always", "/bin/bash", "-l", "-e", "export", "CYGWIN=winsymlinks", "&&", "-e", "ln", "-s", link, file}
//exec { commandLine "cmd", "/c", "mklink", link, file}
//exec { commandLine "export", "CYGWIN=winsymlinks" }
//exec { commandLine "C:\cygwin\bin\ln.exe" , "-s", link, file}
}
else {
exec { commandLine "ln", "-s", link, file}
}
有标准的方法吗?
Gradle没有提供用于创建符号链接的公共API。如果您的构建在JDK 7或更高版本下运行,您可以尝试使用JDK的symlink API。否则,使用exec
也应该可以解决这个问题,只要您能找出正确的命令。
Ant构建器,每个任务都提供一个。似乎是一个解决方案,但正如在评论中指出的那样,它不是真正的跨平台:
task createLink << {
ant.symlink(resource: "file", link: "link")
}
你可以在Java中调用NIO API,但是你需要1.7。看一下createSymbolicLink
Files.createSymbolicLink
from build.gradle
的例子:
File devDir = new File("${project.rootDir}/.dev")
File configDir = new File("${project.projectDir}/config")
Files.createSymbolicLink(devLink.toPath(), devDir.toPath())
在您的目标是创建一个指向可执行文件的符号链接的特殊情况下,有一个跨平台的解决方案,即创建一个shell脚本,它将转发到目标:
File forwarding_script_template
:
#! /bin/bash
_DIR_=$(dirname "$'{'BASH_SOURCE[0]'}'")
"$_DIR_/"{0} "$@"
在Gradle构建文件中:
String templateScript = new File(projectDir,
"gradle/forwarding_script_template.sh").text;
String script = MessageFormat.format(templateScript, target);
writeFile(destination, script);
destination.setExecutable(true);
的writeFile
方法等于:
void writeFile(File destination, String content) {
Writer writer = new FileWriter(destination);
writer.write(content);
writer.close();
}