构建脚本中的平台无关符号链接

时间:2013-06-03 10:46:00

标签: windows cygwin gradle symlink

我需要在gradle构建脚本中添加一个创建符号链接的命令。我知道那个安装了cygwin的人。问题出在export命令上。这是我到目前为止所得到的

    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}
    }

有没有标准的方法呢?

3 个答案:

答案 0 :(得分:4)

每个任务提供的Ant构建器都有一个。看起来像一个解决方案,但正如评论中指出的那样,并不是真正的跨平台:

task createLink << {  
   ant.symlink(resource: "file", link: "link")
}

相反,你可以用Java调用NIO API,但是你需要1.7。看看吧 createSymbolicLink

答案 1 :(得分:3)

Gradle不提供用于创建符号链接的公共API。如果您的构建在JDK 7或更高版本下运行,您可以尝试使用JDK的符号链接API。否则,只要你能找出正确的命令,就应该可以用exec来解决这个问题。

答案 2 :(得分:0)

在您的目标是创建可执行文件的符号链接的特殊情况下,有一个跨平台的解决方法,即创建一个将转发到目标的shell脚本:

档案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();
}