2013-02-03 8 views
9

Ecco lo scenario:In che modo il comando F # Interactive #I è a conoscenza del percorso del progetto?

  1. Aprire Visual Studio. Questo è stato fatto in VS2010 Pro.
  2. Aprire F # Interactive all'interno di Visual Studio
  3. Apri progetto con file di FSX
    Nota: Progetto e file di FSX sono in E:\<directories>\fsharp-tapl\arith
  4. inviare comandi al F # Interactive dal file FSX

    > System.Environment.CurrentDirectory;; 
    val it : string = "C:\Users\Eric\AppData\Local\Temp" 
    

    non ero aspettarsi una directory Temp ma ha senso.

    > #r @"arith.exe" 
    Examples.fsx(7,1): error FS0082: Could not resolve this reference. 
    Could not locate the assembly "arith.exe". 
    Check to make sure the assembly exists on disk. 
    If this reference is required by your code, you may get compilation errors. 
    (Code=MSB3245) 
    
    Examples.fsx(7,1): error FS0084: Assembly reference 'arith.exe' was not found 
    or is invalid 
    

    L'errore di comando #r mostra che F # Interactive attualmente non conosce la posizione del arith.exe.

    > #I @"bin\Debug" 
    --> Added 'E:\<directories>\fsharp-tapl\arith\bin\Debug' 
    to library include path 
    

    Quindi diciamo a F # Interactive la posizione di arith.exe. Si noti che il percorso NON è un percorso assoluto ma un sotto percorso del progetto. Non l'ho detto F # Interactive l'ubicazione del progetto arith E:\<directories>\fsharp-tapl\arith

    > #r @"arith.exe" 
    --> Referenced 'E:\<directories>\fsharp-tapl\arith\bin\Debug\arith.exe' 
    

    E F # Interactive trova correttamente arith.exe riferire il percorso assoluto corretto.

    > open Main 
    > eval "true;" ;; 
    true 
    val it : unit =() 
    

    Ciò conferma che arith.exe è stato correttamente trovato, caricato e funziona.

Quindi, in che modo il comando F # Interactive #I conosce il percorso del progetto poiché la directory corrente non è di aiuto?

Quello che sono veramente dopo è da F # Interactive come si ottiene il percorso del progetto, E:\<directories>\fsharp-tapl\arith.

EDIT

> printfn __SOURCE_DIRECTORY__;; 
E:\<directories>\fsharp-tapl\arith 
val it : unit =() 

risposta

16

In F # Interactive, la directory di default per la ricerca è la directory di origine. Puoi interrogarlo facilmente usando __SOURCE_DIRECTORY__.

Questo comportamento è molto comodo per consentire l'utilizzo di percorsi relativi. Spesso hai i file fsx nella stessa cartella con i file fs.

#load "Ast.fs" 
#load "Core.fs" 

Quando il riferimento a un percorso relativo, F # Interactive sarà sempre utilizzare la directory di origine implicita come punto di partenza.

#I ".." 
#r ... // Reference some dll in parent folder of source directory 
#I ".." 
#r ... // Reference some dll in that folder again 

Se si desidera ricordare la vecchia directory per la prossima di riferimento, è necessario utilizzare #cd invece:

#cd "bin" 
#r ... // Reference some dll in bin 
#cd "Debug" 
#r ... // Reference some dll in bin/Debug 
+0

Questo è veramente utile grazie ... per chiunque sia interessato Mathias Brandewinder ha alcune grandi punte [ ] (http: // brandewinder.com/2016/02/06/10-fsharp-scripting-tips /) per lavorare negli script fsx. Ho avuto un problema nel tentativo di accedere ai pacchetti di nuget da un file di script all'interno di una libreria, #I @ ".. \ packages" l'ha risolto –

Problemi correlati