Ruby Script mit NSTask starten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ruby Script mit NSTask starten

    Hallo Zusammen,

    ich habe ein kleines Ruby Script geschrieben, dass ein kleines Problem perfekt löst, wenn ich es vom Apple Terminal aus starte. Ich habe versucht das Rubyscript mit NSTask zu starten ("/usr/bin/ruby"). Leider ist es wohl so, dass rvm einige Dinge in der Apple_Terminal Umgebung verdreht (NSTask setEnvironment reicht leider nicht).
    Selbst im Terminal verhält sich Ruby verdächtig. Mit "whereis ruby" erhalte ich "/usr/bin/ruby", aber es macht einen Unterschied, ob ich "ruby" oder "/usr/bin/ruby" im Terminal aufrufe.
    Gibt es eine Möglichkeit NSTask so zu starten, dass es sich wie im Terminal verhält?
    Oder mache ich grundsätzlich etwas falsch (Celler und Prozedur unten)?

    Quellcode

    1. NSProcessInfo *pi = [NSProcessInfo processInfo];
    2. out = [WWTaskHelper launchCommand:@"/usr/bin/ruby"
    3. inDirectory:nil withArguments:@[rubyScriptFile,checkoutFile,rubyParseResultFile]andEnvironment:[pi environment]];


    Quellcode

    1. + (NSString *)launchCommand:(NSString *)aCommand inDirectory:(NSString*)aDirectory withArguments:(NSArray *)arguments andEnvironment:(NSDictionary*)envDictionary{
    2. if (arguments == nil) arguments = @[];
    3. [[NSProcessInfo processInfo] processIdentifier];
    4. NSPipe *pipe = [NSPipe pipe];
    5. NSFileHandle *file = pipe.fileHandleForReading;
    6. NSTask *task = [[NSTask alloc] init];
    7. task.launchPath = aCommand;
    8. task.arguments = arguments;
    9. if (aDirectory)
    10. task.currentDirectoryPath = aDirectory;
    11. task.standardOutput = pipe;
    12. if (envDictionary)
    13. task.environment = envDictionary;
    14. [task launch];
    15. NSData *data = [file readDataToEndOfFile];
    16. [file closeFile];
    17. return [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    18. }
    Alles anzeigen
  • wolf70 schrieb:

    Mit "whereis ruby" erhalte ich "/usr/bin/ruby", aber es macht einen Unterschied, ob ich "ruby" oder "/usr/bin/ruby" im Terminal aufrufe.

    Wie macht sich der Unterschied bemerkbar?

    wolf70 schrieb:

    Gibt es eine Möglichkeit NSTask so zu starten, dass es sich wie im Terminal verhält?

    Du solltest mal überprüfen, ob der Interpreter die gleichen Umgebungsvariablen, wie beim Aufruf aus dem Terminal bekommt.
    „Meine Komplikation hatte eine Komplikation.“
  • Unterschiede zwischen "ruby" und "/usr/bin/ruby":
    $ whereis ruby
    /usr/bin/ruby
    $ ruby -v
    ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0]
    $ /usr/bin/ruby -v
    ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13]
    Also etwas anders als gedacht ;)

    Das hier funktioniert besser:
    $ which ruby
    /Users/wwagner/.rvm/rubies/ruby-1.9.3-p194/bin/ruby

    Die Ausgaben von
    $env
    und
    NSLog(@"%@", [[NSProcessInfo processInfo] environment]);
    sehen ebenfalls ziemlich unterschiedlich aus. (PATH und einige spezielle Ruby Variablen).

    Lösungsansätze:
    A) [[NSProcessInfo processInfo] environment] in ein NSMutableDictionary kopieren und
    dort an Path und allen anderen Variablen solange schrauben, bis es passt.
    B) Nach einem Trick suchen, wie ich ein Apple_Terminal starte, dass das Ruby-Script ausführt.
    C) Den Ruby Code durch Objective C ersetzen.
    D) .. was anderes probieren
  • warum verwendest du dann nicht die version? du kannst ja den vollen pfad verwenden weil du das ja eh nur auf deinem system laufen lassen wirst.
    denn auf anderen systemen wird die version ja auch nicht installiert sein.
    ansonsten kannst du ja auch zuerst mittels which rausfinden welches ruby verwendet würde (whereis macht nicht das gleiche, das sieht nur in den standard-locations nach).
    oder du schreibst dein script so um dass es mit allen versionen von ruby läuft (die auf deinen zielsystemen laufen könnten).
  • Hallo Zusammen und vielen Dank,

    vor etwa einem Jahr habe ich für ein Ruby On Rails Experiment nebenbei rvm installiert. Da es nur eine Nebensache war, habe ich rvm nicht weiter beachtet und bin jetzt darüber gestolpert. Original ist auf meinem Mac Ruby 2.0. RVM hat Ruby 1.9 zur Verfügung gestellt und dabei Pfade und einige andere Einstellungen geändert.
    Die Lösung war dann viel einfacher als gedacht. Mit
    $rvm implode
    kann rvm leicht entfernt werden. Danach war wieder alles im Original-Zustand. Mit
    $gem install roo
    konnte die roo Bibliothek für Ruby 2.0 installiert werden. Danach funktionierte das Script reibungslos mit NSTask und dem Terminal.
    Das Ruby 2.0 ist so gut integriert, dass keinerlei Pfadanpassungen notwendig sind und auch die Bibliothek sofort gefunden wird.

    Vielen Dank an:
    macmoonshine
    gritsch
    Michael
    Marco Feltmann