Unterschiedlicher Pfad basierend auf dem Verzeichnis

3

Ich entwickle eine Anwendung mit Play! Framework Version 1.2.4. Also habe ich dieses heruntergeladen und seinen bin/Ordner meinem Pfad hinzugefügt .

Ich bereite mich jedoch darauf vor, ein weiteres Spiel zu starten! Framework-Projekt mit Version 2.2.0, die eine andere Version ist.

Ich möchte nicht einfach meinen Weg ändern, weil ich dann nicht in der Lage bin, an meinem ersten Projekt zu arbeiten.

Ich habe darüber nachgedacht, eine Verknüpfung bin/playzum Stammverzeichnis jedes Projekts herzustellen , aber das scheint nicht die richtige Lösung zu sein. Außerdem hätte ich lieber keine zwei Befehle ( playund play2), die auf ihre jeweiligen Befehle ausgerichtet sind.

Was ist der richtige Weg, um dies zu tun?

Eliot
quelle
3
Darauf hätte ich gerne auch eine Antwort. Mein aktueller Ansatz ist es, ein Skript im Projektverzeichnis zu haben export the-bin-dir/:$PATH, the-bin-dirdas die Binärdateien für dieses Projekt enthält. Es ist jedoch leicht zu vergessen, dieses Skript zu Beginn einer Programmiersitzung aufzurufen.
Tobias Brandt
Natürlich wollte ich sagen export PATH="the-bin-dir/:$PATH".
Tobias Brandt
1
warum willst du nicht verschiedene befehle benutzen playund play2?
Tejas
Aus dem gleichen Grund, aus dem Ruby-Benutzer Ruby193, Ruby199 und Ruby202 nicht verwenden möchten - Sie müssen ständig wissen, welche Version von Ruby Sie für dieses Projekt verwendet haben, und wenn Sie die falsche Version verwenden, funktioniert dies nicht. Natürlich haben Ruby-Benutzer RVM und rbenv, um den globalen Befehl "ruby" und den verzeichnisspezifischen Befehl "ruby" zu verwalten.
Eliot

Antworten:

4

Schreiben Sie das folgende Skript:

#!/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") "$@"

Legen Sie es in Ihrem binVerzeichnis mit dem Namen ab play, mit Links zu den Namen aller anderen Befehle, die sich im playVerzeichnis befinden (falls vorhanden). Jetzt können Sie einfach den gewünschten Befehl eingeben und das Skript ermittelt, welche Version ausgeführt werden soll. (Natürlich binmuss Ihr privates Verzeichnis PATHvor allen Play! Framework-Verzeichnissen am Anfang Ihres Verzeichnisses stehen.)

Wenn Sie Befehle wie eingeben möchten

play project/aardvark/foo

Wenn Sie sich in Ihrem Home-Verzeichnis befinden, ist etwas mehr Arbeit erforderlich. Wenn Sie in der Lage sein wollen, zu tun

play ../battlestar/bar

In der Zeit projects/aardvarkwird das etwas schwieriger.


Ein Nachteil des oben Gesagten ist, dass das playSkript in Ihrem binVerzeichnis jedes Mal aktualisiert werden muss, wenn Sie ein neues Projekt definieren (oder ein altes neu definieren). Hier ist ein Ansatz, mit dem die Konfigurationsinformationen in den Projektverzeichnissen lokalisiert werden können:

#/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") "$@"

Legen Sie dann .playrcin jedes Projekt-Stammverzeichnis eine Datei mit der Aufschrift

export PATH = " play_dir_for_this_project ": "$ PATH"

und legen Sie eine .playrcDatei in Ihrem Home-Verzeichnis mit den Worten

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

als Rücklaufsperre. Eine bessere Fehlerbehandlung kann hinzugefügt werden und bleibt als Übung.

Scott
quelle
Das ist eigentlich ziemlich schlau. Leider bedeutet dies, dass Sie eine globale Datei haben, zu der Sie jedes Mal, wenn Sie ein neues Projekt starten, Einträge hinzufügen müssen. Es ist nicht im Projektverzeichnis lokalisiert. Immer noch die beste Lösung, die ich bisher gesehen habe!
Tobias Brandt
Super, ich hoffe du bekommst das Kopfgeld!
Tobias Brandt
Ich habe gerade gemerkt, dass ich mich beherrsche, wer das Kopfgeld bekommt. :-)
Tobias Brandt
Ja, ich habe mich gefragt, was du meinst. Vielen Dank!
Scott