An Interest In:
Web News this Week
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
- March 15, 2024
Scripts em C
Introduo
Scripts so uma ferramenta bem antiga nos ambientes de TI e ainda hoje so muito utilizados.
Sua natureza interpretada da eles um dinamismo que supera em muito as facilidades de qualquer linguagem compilada.
JavaScript, com Node Js, e Python so exemplos que demonstram que a utilizao de scripts no desenvolvimento de aplicaes ainda segue em alta e sua fora.
Estudando sobre Azure Functions me deparei com um arquivo a diferente extenso ".csx". Trata-se de um arquivo de scripts em linguagem C#, uma novidade para mim depois de vrios anos trabalhando com essa linguagem.
Compartilho aqui com vocs o que aprendi sobre essa ferramenta e minhas concluses.
Os scripts em C Sharp
Nos idos de 2011, Kirill Osenkov informou a comunidade .NET que a MS estava entregando o primeiro release preview do Roslyn Project. Nesse artigo, ele tambm informa que foi "introduzido o conceito de um arquivo de script C#" (OSENKOV, 2011). "A ideia principal por trs de escrever scripts em C# foi permitir que o cdigo fosse avaliado dinamicamente pelo _runtime." (WOJ, 2015).
Para escrever um script C# voc s precisa criar um arquivo com a extenso ".csx" em qualquer editor de textos. Depois de criar o arquivo voc vai precisar de um programa para interpret-lo. Hoje trs opes:
- Mono/Roslyn CSI (que j vem instalado com o Visual Studio);
- cs-scripts;
- dotnet-scripts.
O cs-scripts e dotnet-scripts so multiplataforma, e dotnet-scripts tem a vantagem ser instalado com um dotnet tool
e rodar usando o .NET 5.
No restante desse artigo vamos utilizar o dotnet-scripts para nossos exemplos. Para instal-lo digite o comando abaixo em seu console de preferncia:
dotnet tool install -g dotnet-script
Sintaxe
"Um script C# tem requisitos de sintaxe mais flexveis, ento a experincia geral pode ser sem cerimnias. Abaixo esto algumas coisas a serem lembradas:
- o ponto de entrada para o seu script a primeira linha do seu arquivo (nenhum mtodo
Main
obrigatrio)- qualquer cdigo permitido a partir da primeira linha (nenhuma classe de nvel superior,
Program
, obrigatria)- funes globais so permitidas;
- sem
namespaces
;- sem um arquivo de projeto ou soluo;
- seu script pode ser totalmente autocontido;
- instrues
using
e referncias so importados implicitamente pelo aplicativo hospedeiro (responsvel por executar o script)"(WOJ, 2015)
Eu acrescento essa lista o desenvolvimento de extenses, que foi algo que identifiquei nos meus testes.
Abaixo um exemplo de arquivo de script C# utilizado para inicializar o processo:
#load "Configs.csx"#load "src/Data/TodoListRepository.csx"#load "src/Services/TodoListService.csx"#load "src/Controller/TodoListController.csx"using Microsoft.Extensions.Configuration;await Run(Args.ToArray());async Task Run(string[] args){ using TodoListRepository repository = new(Configs.Configuration.GetConnectionString("db")); TodoListService service = new(repository); TodoListController controller = new(service); await controller.ExecuteCommand(args);}
Como pode ser visto a sintaxe da linguagem a mesma j conhecida, s que sem a estrutura Program.Main
. A forma de referenciar outros arquivos ".csx" utilizando a diretiva #load "<caminho do arquivo>"
.
Abaixo um exemplo de arquivo para leitura de configuraes, que faz referncia pacotes nuget:
#r "nuget: Microsoft.Extensions.Configuration, 5.0.0"#r "nuget: Microsoft.Extensions.Configuration.Binder, 5.0.0"#r "nuget: Microsoft.Extensions.Configuration.UserSecrets, 5.0.0"#r "nuget: Microsoft.Extensions.Configuration.EnvironmentVariables, 5.0.0"using Microsoft.Extensions.Configuration;public static class Configs{ private static IConfiguration _config; public static IConfiguration Configuration { get { if (_config is null) SetConfig(); return _config; } } private static void SetConfig() { _config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddUserSecrets("csx-script-app") .AddEnvironmentVariables() .Build(); } public static T GetConfig<T>(string sectionName) { return Configuration.GetSection(sectionName).Get<T>(); }}
Referenciar um pacote bem simples utilizando #r "nuget: <nome do pacote>, <verso>"
.
Se for necessrio importar um assembly prprio utilize a direntiva #r "<caminho da dll>"
. Segue um exemplo:
#r: "./build/MeuAssembly.dll"
Desenvolvi um aplicativo Todo de exemplo e publiquei no meu GitHub onde possvel ver esses scripts em ao. Esse o link do projeto.
Debug
Se voc utiliza o Visual Studio Code como seu editor de texto/IDE debugar um script algo que seguir os padres que voc j esta acostumado. Basta configurar seu launch.json conforme abaixo, colocar o breakpoint e clicar em F5.
{ "version": "0.2.0", "configurations": [ { "name": ".NET Script Debug - Linux", "type": "coreclr", "request": "launch", "program": "${env:HOME}/.dotnet/tools/dotnet-script", "args": [ "${file}" ], "cwd": "${workspaceFolder}", "stopAtEntry": false, }, { "name": ".NET Script Debug - Windows", "type": "coreclr", "request": "launch", "program": "dotnet", "args": [ "${env:USERPROFILE}/.dotnet/tools/.store/dotnet-script/1.2.1/dotnet-script/1.2.1/tools/net5.0/any/dotnet-script.dll", "${file}" ], "cwd": "${workspaceRoot}", "stopAtEntry": false } ]}
Compilao com um aplicativo e execuo no Linux.
Um ponto interessante que achei utilizando o dotnet-script
no Windows foi a possibilidade de criar um aplicativo autocontido. Para fazer isso muito simples basta publicar o script como no exemplo abaixo:
dotnet script publish Main.csx
Um diretrio publish ser criado com um executvel. Como um aplicativo autocontido, basta copi-lo para qualquer computador e, mesmo sem o .NET instalado, execut-lo.
Em um ambiente Linux incluindo como primeira linha a diretiva #!/usr/bin/env dotnet-script
possvel executar o script como qualquer outro, lembrando que preciso dar permisso de execuo no arquivo.
Concluso e aplicaes
Observando a tecnologia vemos que essa ferramenta bem madura e que vem se desenvolvendo junto com a plataforma e que ir continuar nesse caminho no futuro.
Hoje possvel escrever um programa console em C# de forma minimalista sem uma classe Program, um mtodo Main e com funes globais, algo que at pouco tempo atrs era impensvel. Com scripts C# voc consegue tudo isso e ainda a vantagem de desenvolver sem um ".csproj" e sem o tempo de compilao, apenas escrever o cdigo e j validar seu programa prontamente.
Testes de integrao que sero executados sob demanda; programas de carga que sero utilizados apenas uma vez; pequenos testes e estudos de algum pacote Nuget novo; Scripts de configurao de ambiente. Esses so apenas alguns exemplos de utilizao de scripts em C#.
No caso de scripts para configurao de ambiente ou inicializao de uma aplicativo, ainda existe a vantagem latente de seguir com a mesma linguagem que o projeto foi desenvolvido. Para a equipe isso uma vantagem, visto que preciso um esforo adicional para aprender e escrever o mesmo script com um bash script ou bat tradicional.
Em programas de carga existe ainda a vantagem de conseguir reaproveitar o cdigo e as regras de negcio do prprio projeto, sem duplicidades.
As aplicaes so muitas e certamente vale a pena incluir no "arsenal".
Referncias
BAHRAMINEZHAD, Ali. Hitchhikers Guide to the C# scripting. ITNEXT, 2019. Disponvel em: <https://itnext.io/hitchhikers-guide-to-the-c-scripting-13e45f753af9>. Acesso em: 11-09-2021
MICHAELIS, Mark. C# Scripting. Microsotf Docs, 2016. Disponvel em: <https://docs.microsoft.com/en-us/archive/msdn-magazine/2016/january/essential-net-csharp-scripting>. Acesso em: 11-09-2021
OSENKOV, Kirill. Introducing the Microsoft Roslyn CTP. Microsoft DevBlogs, 2011. Disponvel em <https://devblogs.microsoft.com/visualstudio/introducing-the-microsoft-roslyn-ctp/>. Acesso em: 12-09-2021
SALVADEO, Andr C B. Todo List em C# script (CSX). Github, 2021. Disponvel em <https://github.com/andrebarsotti/csx-script-sample>. Acesso em: 12-09-2021
VOGEL, Peter. Making Your Life Easier with C# Scripting. Visual Studio Magazine, 2021. Disponvel em: <https://visualstudiomagazine.com/articles/2021/06/14/csharp-scripting.aspx>. Acesso em: 11-09-2021
WOJ, Filip. Dotnet script. Github, 2021. Disponvel em <https://github.com/filipw/dotnet-script>. Acesso em: 11-09-2021
WOJ, Filip. Adding C# scripting to your development arsenal - Part 1. Microsoft Docs - Blog Archive - Canadian Developer Connection, 2015. Disponvel em <https://docs.microsoft.com/pt-br/archive/blogs/cdndevs/adding-c-scripting-to-your-development-arsenal-part-1>. Acesso em: 12-09-2021
Original Link: https://dev.to/andrebarsotti/scripts-em-c-10ff
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To