2012-11-25 11 views
5

zorientowali się, że nie można załadować jedną bibliotekę skryptu z innego łatwo:Jak załadować przywoływane biblioteki skryptów z pliku skryptu Roslyn?

module.csx

string SomeFunction() { 
    return "something"; 
} 

script.csx

ExecuteFile("module.csx"); 
SomeFunction() <-- causes compile error "SomeFunction" does not exist 

To dlatego, że kompilator nie wie modułu. csx w czasie kompilacji script.csx afaiu. Mogę dodać kolejny skrypt, aby załadować dwa pliki z tego jednego, a to zadziała. Jednak to nie takie ładne.

Zamiast tego chciałbym, aby mój czek scripthost dla specjalnej składni „moduł obciążenia” w moich skryptów i wykonywać te moduły przed rzeczywistego wykonywania skryptu.

script.csx

// load "module.csx" 
SomeFunction() 

Teraz kilka podstawowych manipulacji ciąg, mogę dowiedzieć się, które moduły do ​​obciążenia (linie, które zawiera ładunek // ...) i załadować że pliki (GIST tutaj https://gist.github.com/4147064) :

foreach(var module in scriptModules) { 
    session.ExecuteFile(module); 
} 
return session.Execute(script) 

Ale - skoro mówimy Roslyn, to powinien być jakiś dobry sposób na przeanalizowanie skryptu pod kątem składni, której szukam, prawda?

I może nawet istnieć sposób, aby obsługiwać biblioteki modułów kodu?

+0

Pierwsza wersja tego wszystkiego: https://github.com/joeriks/RoslynWebScript – joeriks

Odpowiedz

6

Obecnie w Roslyn nie ma możliwości odniesienia się do innego pliku skryptu. Rozważamy przeniesienie #load z komendy hosta okna interaktywnego na część języka (np. #r), ale obecnie nie jest ona zaimplementowana.

Jeśli chodzi o sposób obsługi ciągów, można je normalnie parsować, a następnie szukać dyrektyw preprocesora, które są nieznanego typu i zagłębić się w strukturę w ten sposób.

+0

Dzięki, będę analizować drzewo składni dla mojej wn dyrektywa (na przykład #load), a następnie utworzy nowe drzewo bez tych dyrektyw i uruchomi nowe drzewo? A może powinienem użyć Compilation.Create ... zamiast Scripting Execute? – joeriks

+0

Przepisywanie drzewa, a następnie wywoływanie Execute brzmi jak rozsądny plan. –

1

Dołącz skryptu:

#load "common.csx" 
... 

i skonfigurować resolverowi źródłowy podczas uruchamiania skryptów:

Script<object> script = CSharpScript.Create(code, ...); 
var options = ScriptOptions.Default.WithSourceResolver(new SourceFileResolver(new string[] { }, baseDirectory)); 
var func = script.WithOptions(options).CreateDelegate() 
... 
Powiązane problemy