2013-09-24 11 views
6

Supponiamo che uno script abbia bisogno di accedere a una directory, ad esempio /some/where/abc su un sistema operativo "arbitrario". Ci sono un paio di opzioni per costruire il percorso in Ruby:Come costruire un percorso assoluto portatile in Ruby?

  • File.join('', 'some', 'where', 'abc')
  • File.absolute_path("some#{File::SEPARATOR}where#{File::SEPARATOR}abc", File::SEPARATOR)
  • Pathname nel API standard

Credo che la prima soluzione è abbastanza chiara, ma idiomatica. Nella mia esperienza, alcune revisioni del codice chiedono un commento per spiegare che cosa fa ...

La questione

Esiste un modo migliore per costruire un percorso assoluto è Ruby, dove i mezzi migliori "fa il lavoro e parla da solo "?

+2

Vorrei solo collegare il documento nella revisione del codice. Dice esplicitamente "Restituisce una nuova stringa formata unendo le stringhe usando File :: SEPARATOR." 'File # join' è il solito modo di produrre percorsi portatili. –

+1

A seconda di cosa intendi per "sistema operativo arbitrario", "" tmp/abc/"' come stringa letterale è un percorso valido su Linux, Mac e Windows. –

+0

La documentazione, o solo il percorso previsto come commento, funziona bene. Sto solo cercando di trovare incantesimi nascosti o dimenticati in Ruby. –

risposta

3

Quello che vorrei raccogliere se stavo facendo una revisione del codice è che su Windows /tmp non è necessariamente il posto migliore per creare una directory temporanea, e anche l'argomento iniziale '', non è forse ovvio per la recensione casuale che crea <nothing>/tmp/abc. Pertanto, mi sento di raccomandare questo codice:

File.join(Dir.tmpdir(), 'abc') 

Vedi Ruby-doc for an explanation.

UPDATE

Se ci espandiamo il problema a una soluzione più generica che non coinvolge usando tmpdir(), non riesco a vedere un modo rotonda con l'iniziale '' linguaggio (hackerare?). Su Linux questo non è un problema, forse, ma su Windows con più lettere di unità lo sarà. Inoltre, non sembra esserci un'API o una gemma Ruby per iterare i punti di montaggio.

Pertanto, la mia raccomandazione sarebbe di delegare la definizione del punto di montaggio di un'opzione di configurazione che potrebbe essere '/' per Linux, 'z:/' per Windows, e smb://domain;[email protected]/mountpoint per una condivisione Samba, quindi utilizzare File.join(ProjectConfig::MOUNT_POINT, 'some', 'where', 'abc').

+0

Buona presa sul tmpdir. Questo è ancora più portatile e riflette anche meglio l'intento. +1 –

+0

Grazie per questo suggerimento. Ottimo per affrontare il mio particolare problema. Non contrassegno la domanda come risposta ancora. Vediamo se qualcuno ha una buona idea per il problema generale (ora capendo che '/ tmp' conduce la domanda a un modo inaspettato). –

+1

@Eric Vedo che hai riformulato la domanda! Ho pensato e guardato in giro, e non riesco a vedere una soluzione generale a ciò che mi rende più scomodo, il principale "" ". Sembra che non ci sia un modo generico per iterare i punti di mount, come ottenere 'c: /' per Windows o un punto di montaggio Samba su Linux, ecc. Forse delegare la definizione del punto di mount a un'opzione di configurazione è il miglior compromesso e uso ' File.join (ProjectConfig :: MOUNT_POINT, 'foo', 'bar') '? –

2

File#join è il modo canonico per costruire un percorso portatile in Ruby. Mi chiedo chi sta facendo la recensione. Forse Ruby è nuovo per la tua organizzazione.

Sono d'accordo con @ChrisHeald che riferirsi alla documentazione è il modo migliore per spiegare il codice a un revisore.

+0

Grazie. Sono d'accordo con tutti i commenti finora, quindi +1. Il file # join è il mio approccio preferito, ma fa affidamento su un idioma. La domanda è davvero "mettere in mostra" un modo migliore per risolvere questo problema (se esiste) --- la recensione è solo impostazioni per illustrare cosa può accadere. –

Problemi correlati