构建脚本中独立于平台的符号链接



我需要添加到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();
}

最新更新