O tym, że Microsoft chciałby “uskrypcić” C#, pierwszy raz usłyszałem w 2009 roku na MVP Summit. Efektem takich zapowiedzi jest projekt Roslyn – czyli Compiler As A Service. Idea bardzo interesująca i zacna, jej implementacja – z tego co czytałem – również.
Glenn Block (m.in.) wziął Roslyn, wziął NuGeta, wziął C#, wziął fajny pomysł i zainicjował projekt ScriptCS.
Idea jest prosta (wyjaśniona w większych szczegółach na blogu Glenna: “scriptcs – Living on the edge in C# without a project on the wings of Roslyn and Nuget“):
- piszemy C#
- piszemy tyle C# ile nam potrzeba, tzn. tworzymy klasy tylko wtedy jeśli chcemy mieć klasy – jeśli nie to nie
- do zależności wykorzystujemy NuGet
- bez żadnych csproj/sln uruchamiamy swoje skrypty – i działają
Prosto, szybko i przyjemnie.
Po niekolei (tzn w odwrotnej kolejności) zaprezentuję na najbanalniejszym przykładzie o co chodzi:
W celu zobaczenia czegoś takiego na konsoli po wywołaniu “scriptcs first_script.csx”:
trzeba stworzyć plik “first_script.csx” i wypełnić go kodem C#. Zwróćcie uwagę, że potrzebna jest tylko jedna linjka, bez żadnych klas i przestrzeni nazw:
System.Console.WriteLine("hello from ScriptCS!");
Oprócz tego, obok tego pliku, tworzymy katalog “packages”. Wymóg istnienia tego katalogu nawet jeśli nie jest potrzebny to chyba jakiś bug, ale nevermind.
Oczywiście wykonanie powyższej komendy zakłada, że plik “scriptcs.exe” jest dodany do PATH. Musimy tą zmienną środowiskową zmodyfikować dopisując do niej katalog /bin/debug powstający w wyniku kompilacji projektu ScriptCS.
Kompiluje się bardzo prosto: wystarczy wywołać “msbuild ScriptCS.sln” w głównym katalogu repozytorium. A repozytorium trzeba najpierw zaciągnąć z githuba:
git clone https://github.com/scriptcs/scriptcs.git
Na samym początku jednak warto jeszcze zainstalować nuget cmdline bootstrapper.
… i to wszystko odwrotnie trzeba zrobić. Miłej zabawy!
Ale to jeszcze nie koniec.
Bo na przykład warto wiedzieć, że już powstał plugin do Sublime Text pozwalający wykorzystać ScriptCS do uruchamiania kodu C# z poziomu tego niesamowitego edytora – wystarczy ctrl+B:
Trzeba też zdawać sobie sprawę że ten powyższy kod to tylko popierdułka i żadne mecyje. Polecam spojrzeć na ciekawsze przykłady zastosowania: https://github.com/scriptcs/scriptcs-samples. Znajdziecie tam m.in. przykład SignalR, WPF albo coś co mózg rozwala: uruchomienie NancyFx z poziomu ScriptCS!
Nasuwa się pytanie: dlaczego wcześniej nikt czegoś takiego nie napisał?
Wiem, że można pisać kod C# inline w Powershell i go wykonywać, jak pisał na przykład Wiktor Zychla, ale wnioskuję z posta przytoczonego, że PS wymaga kompletnych struktur C#, razem klasą chociażby – overhead, którego pozbywamy się w ScriptCS.
Ale jak przy Powershell jesteśmy… Dzięki temu projektowi Doug Finke (Powershell MVP) puścił na Twitterze link (https://gist.github.com/dfinke/5148895#file-psroslyn-ps1) do czegoś co pozwala na taki kod w Powershell, obadajcie, wypas!:
PS C:\> Invoke-Csx @" using System.Linq; Enumerable.Range(1, 10).Select(x => x * x); "@ | Where {$_ % 2 -eq 0} | ForEach {$_*2}
Tak więc zapraszam do eksperymentów! Projekt powoli chyba zaczyna osiągać taką rzeszę zwolenników że niedługo będzie można założyć iż nie umrze raczej śmiercią naturalną. Polecam śledzenie jego konta na Twitterze aby być na bieżąco: https://twitter.com/scriptcsnet.
Wygląda ciekawie, tylko czy ma powłokę interaktywną?
Antek,
Nie ma, ale ten projekt ma może 2 tygodnie:). Więc podejrzewam że się czegoś podobnego dorobi.
Póki co dzięki pluginowi do sublime można mieć namiastkę REPLa.
C# jako język skrytptowy? Meet ScriptCS | Maciej Aniserowicz o programowaniu…
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl…
Hmm….ale taki język skryptowy daje sam Roslyn, więc czym jest ten projekt nie bardzo rozumiem?
Paweł
Paweł,
Roslyn to biblioteka, a nie exe do którego podajesz skrypt, który wykryje nugety referencje. ScriptCS ma poziom skomplikowania dość niski, wystarczy spojrzeć na kod na GitHubie. To bardziej implementacja koncepcji stojącej za Roslyn. Dlatego też napisałem że dziwne czemu wcześniej nikt tego nie napisał:).
A nie co ja plotę, jest przecież rcsi.exe. W takim razie chodzi głównie o rozszerzenie tego mechanizmu o dodatkowe opcje, jak nuget właśnie.
No właśnie o tym mówię. Pomijając nuget’a to 1:1 to samo :). Przynajmniej tak wygląda…
Paweł
Paweł,
No tak, ale nuget w tym kontekście to właśnie poniekąd “big deal”:). Glenn Block sam napisał: “Roslyn + Nuget = scriptcs”.
Wiem że teraz trwają prace np nad debuggowaniem takich skryptów. Nie wiem jak to wygląda w gołym Roslyn, nie bawiłem się tym.
Więcej o postępach w debuggowaniu tutaj: https://github.com/scriptcs/scriptcs/issues/68 .
na razie jedyny plus tego ze to mozna z konsoli odpalic. tak to nie odkryli ameryki – repl byl dostepny w MONO, zas do takich pomniejszych spraw i kodu to LinqPad sie idealnie nadaje – wiec ten przyklad z console write line w LinqPad zapisuje w jednej linijce bez using – sam domyslnie dodaje ten using.
Pewnie jakby sie uprzec to i za pomoca command line mozna linqPad odpalic (ale tutaj zgaduje nie sprawdzalem)
Tak czy siak, fajnie wykorzystany Roslyn – w ogole musze do niego znow powrocic, bo jak pisalem ten C# to Knockout JS to jeszcze z Roslyn nie moglem skorzystac :(
Zgadzam się z przedmówcą, Gutkiem. W Mono od dawna jest możliwość tworzenia i uruchamiania skryptów w CS. Dodatkowo jest interaktywna konsola – http://www.mono-project.com/CsharpRepl . Używanie skryptów CS w Mono jest powszechnie znane – korzysta z tego np. Unity3D w silnikach do gier. MS wprowadzając Roslyn nic nowego nie odkrywa, dziwi mnie jedynie , iż robią to tak późno. Zaś można liczyć na to, iż po wprowadzeniu Roslyna do platformy .NET jako standardu, spowoduje wysyp przykładów jego użycia.
Panowie,
ale nie mylmy Roslyn’a z scriptcs czy rcsi. Roslyn to trochę więcej a te dwie rzeczy to tylko pokazanie co za pomocą Roslyn’a można (ale też nie wyczerpanie jego możliwości). Tak tylko kwestią uzupełnienia…bo takie odniosłem wrażenie (może mylne) :)
Paweł
wyglada na to ze autorzy tej strony (http://www.tryfsharp.org/) tez dowiedzieli sie o Roslynie ;]
A CodeDom ( http://www.codeguru.com/vb/gen/article.php/c19573/Microsoft-NET-CodeDom-Technology.htm ) to pies, mi to pachnie NIH, akurat Roslyna nie widziałbym w tej roli (tzn. jest swego rodzaju armatą na muchy).
Ja tam wolę LinqPad-a, jak chce coś sprawdzić szybko to wpisuje i uruchamiam, naprawdę super narzędzie polecam, kupiłem nawet licencję na wersję Pro jest warta swojej ceny.
Roslyn to dużo więcej niż CodeDom: http://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom
A ScriptCS to więcej niż LinqPad. Dzięki temu można pisać reużywalne skrypty i je wykonywac na różnych maszynach. C#-em zastąpić Powershella. LinqPad to po prostu proces “odpal -> napisz -> uruchom -> skasuj -> zapomnij” podczas gdy ScriptCS oferuje wszystko to czego potrzeba od środowiska skryptowego. Polecam zresztą posłuchać jednego z ostatnich odcinków DotNetRocks gdzie Glenn opowiada i o powstaniu projektu i o dalszej wizji, bardzo interesujące: http://www.dotnetrocks.com/default.aspx?showNum=853 .
Ale dlaczego zastępować Powershella ? Czegoś mu brakuje ? Powershell nadaje się to skryptów o wiele bardziej niż czysty C#.
Słuchałem odcinka .NetRocks na razie nie widzę do tego konkretnego zastosowania ale zobaczymy jak to się rozwinie.
Waldimen,
Na pewno w chwili obecnej nie nadaje się do produkcyjnego zastosowania – w końcu projekt powstał 2 tygodnie temu. Ale jestem bardzo ciekaw jakie możliwości to przed nami otworzy. Ja bardzo lubię C# i o ile powershell z miesiąca na miesiąc doceniam coraz bardziej, to C# jest wygodniejszy.
Tytuł to jakaś gra słowna, której nie rozumiem, czy zwykła literówka?
somekind,
Literówka:). Thx poprawiam.