基于目录的不同路径

基于目录的不同路径

我正在使用 Play! Framework 版本 1.2.4 开发应用程序。因此我下载了此版本并将其bin/文件夹添加到我的路径中。

然而,我正准备使用不同的版本 2.2.0 来启动另一个 Play! Framework 项目。

我不想改变我的道路,因为那样我就无法开展我的第一个项目。

我考虑过bin/play对每个项目的根目录进行符号链接,但这似乎不是正确的解决方案。此外,我不希望有两个命令(playplay2)作为其各自命令的别名。

正确的做法是什么?

答案1

编写以下脚本:

#!/bin/sh
projdir1="$HOME/project/aardvark"
playdir1=/bin/play1.2.4
projdir2="$HOME/project/battlestar"
playdir2=/bin/play2.2.0
case "$PWD" in
  "$projdir1" | "$projdir1"/*)
        export PATH="$playdir1":"$PATH"
        ;;
  "$projdir2" | "$projdir2"/*)
        export PATH="$playdir2":"$PATH"
        ;;
  *)
        echo "I don't know which version of \"play\" to use in $PWD"
        exit 1
esac
exec $(basename "$0") "$@"

将其放在bin名为 的目录中play,并附上目录中其他命令的名称链接play(如果有)。现在,您只需键入所需的命令,脚本就会确定要运行哪个版本。(当然,您的私有bin目录必须位于 开头附近PATH,在任何 Play!框架目录之前。)

如果你想输入如下命令

play project/aardvark/foo

在您的主目录中,这需要做更多的工作。如果您希望能够做到

play ../battlestar/bar

而在projects/aardvark,这将会稍微困难一些。


上述方法的一个缺点是,每当您定义新项目(或重新定义旧项目)时,都必须更新目录play中的脚本。以下是一种允许在项目目录中本地化配置信息的方法:bin

#/bin/sh
case "$PWD" in
  "$HOME"/*)
        # OK
        ;;
  *)
        echo "This script should be used only within your home directory tree."
        exit 1
esac
rcfile=".playrc"
while [ ! -f "$rcfile" ]
do
    rcfile="../$rcfile"
done
. "$rcfile"
exec $(basename "$0") "$@"

.playrc然后在每个项目根目录中放置一个文件,内容如下:

导出路径=“play_dir_for_this_project“:”$PATH”

并将一个.playrc文件放在你的主目录中,说

echo "You aren’t in a \"play\" project directory."
exit 1

作为后盾。可以添加更好的错误处理,留作练习。

相关内容