O blog da AWS

Abrindo o código do assistente de portabilidade para .NET

Por: Steve Roberts, Developer Advocate focused on .NET and PowerShell development, AWS

Traduzido por: Kevin Lira, Senior SA, WWPS Brazil, AWS

 

Em julho de 2020, a AWS lançou o Porting Assistant for .NET, uma ferramenta para analisar a compatibilidade de aplicativos .NET Framework e estimar o esforço necessário para portá-los para .NET Core. A portabilidade de aplicativos para .NET Core permite que você tire proveito de investimentos futuros em .NET, redução de gastos com licenças e inovações para melhorar o dimensionamento e o desempenho de aplicativos no Linux.

O “Porting Assistant for .NET” analisa as dependências do pacote NuGet e o uso da API em aplicativos .NET Framework no nível da solução. Com o esforço de compatibilidade e portabilidade avaliado, o assistente ajuda ainda mais no processo de portabilidade removendo o esforço manual necessário para converter arquivos de projeto para o novo formato .NET Core, incluindo a atualização de pacotes NuGet quando houver substituições compatíveis. O “Porting Assistant for .NET” é gratuito e você pode ler mais sobre a ferramenta na postagem do blog do anúncio de lançamento original. Um vídeo que mostra os recursos do assistente também pode ser visualizado no YouTube.

Fomos encorajados por comentários positivos de nossos clientes e da comunidade .NET sobre a economia de tempo e esforço na portabilidade resultante do uso do assistente. Kloia, uma parceira da Amazon Partner Network, que portou o aplicativo EposNow Point-of-Sale (POS) para .NET Core disse:

“O aplicativo era uma API abrangente e multicamadas com mais de 20 projetos agrupados em uma única solução. Com o Porting Assistant, toda a avaliação de compatibilidade e estimativa de esforço, que normalmente levaria vários dias, foi concluída em poucas horas. Além disso, durante a fase de portabilidade, a ferramenta fez recomendações que reduziram significativamente o esforço manual. ”

Você pode ler mais sobre a experiência de Kloia usando o assistente nesta postagem do blog.

Do que estamos abrindo o código hoje?

Com o lançamento original, abrimos o código-fonte dos data sets usados para determinar a compatibilidade. Neste Blog, iremos abrir o código-fonte e os componentes de análise de compatibilidade do assistente. Reconhecemos que portar aplicativos .NET Framework para .NET Core é um amplo espaço e queremos incentivar os usuários da comunidade a compartilhar e usar a crescente base de conhecimento sobre as práticas recomendadas para portar aplicativos .NET por meio de recomendações. E, embora continuemos expandindo os data sets usados para avaliação, também queremos convidar os membros da comunidade a colaborar mais ativamente. Os usuários são incentivados a participar por meio de questões abertas no GitHub, revisar, comentar, fazer perguntas, oferecer sugestões ou abrir novas questões se desejar iniciar uma nova conversa. Também agradecemos sua participação em contribuir com novas recomendações para os data sets, revisar e oferecer sugestões sobre os data sets existentes.

Com o lançamento desse código aberto, também incentivamos os membros da comunidade, incluindo nossos parceiros de solução, a adicionar extensões ao Porting Assistant para .NET para melhor atender às necessidades dos clientes. Junto com os projetos de código-fonte observados abaixo, estamos publicando um roteiro proposto para o projeto, dando aos participantes da comunidade a oportunidade de comentar e influenciar o futuro do assistente. O roteiro continuará a ser atualizado incorporando solicitações de recursos oferecidos pela comunidade, questões levantadas e muito mais.

Adicionando aos data sets do modelo original, dois novos repositórios para a análise de código e APIs de avaliação de back-end constituem a funcionalidade central do assistente. Estes são os repositórios atuais, todos lançados sob a licença Apache 2.0:

  • Cliente .NET do Porting Assistant: contém as APIs de avaliação de back-end e o código de portabilidade do projeto, facilitando a interface com o assistente a partir de seu próprio código
  • Codelyzer: Contém o analisador de código-fonte usado pelas APIs de avaliação.
  • .NET Datastore para o Porting Assistant: O repositório original contendo os data sets usados na avaliação de compatibilidade. Como parte do lançamento, também adicionamos uma pasta de recomendações que permite contribuições para o NuGet e os dados de substituição da API.

Extendendo o assistente de portabilidade para .NET

Os arquivos README nos repositórios mostram exemplos de como utilizar os vários componentes do assistente. Por exemplo, talvez você esteja interessado em contribuir com as recomendações. Em caso afirmativo, dê uma olhada na pasta recommendation no repositório de data store. Esta pasta contém uma série de arquivos formatados em JSON, um para cada pacote em nuget.org. Os arquivos de recomendação representam dados de compatibilidade em pacotes exclusivos de 211K e 2,5 milhões de versões de pacote. Para cada pacote, o arquivo captura informações de compatibilidade para todas as versões do pacote.

O formato do arquivo é descrito no arquivo RECOMMENDATIONS.md do repositório. Aqui está um exemplo de recomendação que é usada quando o assistente encontra o uso de System.Data.SqlClient em um arquivo de código-fonte. O topo da recomendação indica o pacote e o namespace (o tipo é usado para agrupar recomendações):

"Name": "System.Data.SqlClient",
"Version": "1.0.0",
"Packages": [
    {
      "Name": "System.Data",
      "Type": "SDK"
    }
],

A seção Recommendations a seguir informa ao assistente o que procurar no código-fonte; abaixo, o exemplo mostra que estamos procurando o uso do namespace System.Data.SqlClient:

"Type": "Namespace",
"Value": "System.Data.SqlClient",

O campo Description resume as etapas necessárias para migrar para o .NET Core. Para esta recomendação, existem três etapas. Adicione uma referência de pacote a Microsoft.Data.SqlClient e remova todas as instruções using para System.Data.SqlClient e, finalmente, adicione uma instrução using para Microsoft.Data.SqlClient:

"Description": "Add reference to Microsoft.Data.SqlClient\r\nAdd Microsoft.Data.SqlClient namespace\r\n Remove System.Data.SqlClient namespace\r\n"

A Recommendation completa é mostrada abaixo:

{
  "Name": "System.Data.SqlClient",
  "Version": "1.0.0",
  "Packages": [
    {
      "Name": "System.Data",
      "Type": "SDK"
    }
  ],
  "Recommendations": [
    {
      "Type": "Namespace",
      "Value": "System.Data.SqlClient",
      "RecommendedActions": [
        {
          "Source": "OpenSource",
          "TargetFrameworks": [
            "netcoreapp3.1"
          ],
          "Description": "Add reference to Microsoft.Data.SqlClient\r\nAdd Microsoft.Data.SqlClient namespace\r\n Remove System.Data.SqlClient namespace\r\n",         
        }
      ]
    }
  ]
}

Em vez disso, talvez você esteja interessado em estender a análise da compatibilidade de aplicativos do .NET Framework com o .NET Core. Para isso, dê uma olhada no analisador de código baseado em Roslyn no novo repositório do Codelyzer. O processador neste projeto percorre uma árvore de sintaxe abstrata (ASA) para coletar metadados nos componentes do arquivo de origem que constituem seu aplicativo – seu arquivo de solução, arquivos de projeto, namespaces, classes, métodos, invocações de método e expressões literais, etc. O Code Analyzer é uma estrutura projetada para suportar a análise do código-fonte do aplicativo em diferentes linguagens, embora atualmente apenas suporte linguagens .NET (C#, Visual Basic). Conforme mostrado no arquivo README do repositório, construir e executar um analisador em relação ao arquivo de solução de um aplicativo é fácil:

// 1. Create logger object
var loggerFactory = LoggerFactory.Create(builder =>
        builder.SetMinimumLevel(LogLevel.Debug).AddConsole());
var logger = loggerFactory.CreateLogger("Analyzer");
var outputPath = @"/home/users/steve/porting-analysis";

// 2. Create Configuration settings
var configuration = new AnalyzerConfiguration(LanguageOptions.CSharp);
configuration.ExportSettings.OutputPath = outputPath;

// 3. Get Analyzer instance based on language
var analyzer = CodeAnalyzerFactory.GetAnalyzer(configuration, logger);

// 4. Analyze the project or solution
var projectFilePath = @"/home/users/steve/projects/TestProject.csproj";
var analyzerResult = await analyzer.AnalyzeProject(projectFilePath);
Console.WriteLine("The results are exported to file : " + analyzerResult.OutputJsonFilePath);

A saída do analisador pode ser um objeto de resultados ou, conforme solicitado no exemplo de código acima, um arquivo no formato JSON. Em ambos os casos, os resultados detalham as entidades descobertas na árvore do código-fonte, seu nome, tipo (namespace, método, propriedade, etc.), a localização do caracter, extensão da entidade descoberta no arquivo-fonte relevante, entre outros dados . Um exemplo da saída pode ser encontrado no README junto com o exemplo de código anterior.

A saída da análise é consumida pelos projetos contidos no repositório do client, começando com o projeto PortingAssistant.Client.Analysis. O aplicativo cliente usa os data sets no repositório do datastore para determinar a compatibilidade do aplicativo com o .NET Core. Ele faz isso verificando os pacotes NuGet consumidos (públicos e privados) e as chamadas de API feitas pelo aplicativo em relação aos modelos para determinar se o pacote ou a chamada de API tem um equivalente do .NET Core. No vídeo vinculado anteriormente, você pode ver um passo a passo dos vários relatórios de compatibilidade que o assistente fornece.

O Porting Assistant for .NET se beneficia de vários projetos e contribuições de código aberto, e agradecemos seu apoio e contribuição em nos ajudar a entregar esta ferramenta. Uma lista de projetos e colaboradores do Porting Assistant para .NET pode ser encontrada no GitHub.

Estamos entusiasmados com o Porting Assistant for .NET e com a reação positiva da comunidade .NET. Conforme observado, estaremos mantendo um roteiro nos repositórios. Idéias para a direção futura do assistente incluem integrações IDE, uma interface de linha de comando e suporte aprimorado para varredura de repositórios de código-fonte (públicos e privados). Reconhecemos que o escopo de portar aplicativos .NET é amplo o suficiente para que uma abordagem baseada na comunidade para lidar com isso seja necessária, então planejamos continuar a trabalhar na extensibilidade – por exemplo, adicionando a capacidade dos usuários de adicionar lógica adicional para estender o análise. A equipe agradece comentários e contribuições em todas essas áreas e muito mais, e espera continuar a colaborar com a comunidade no Client do Porting Assistant para .NET, Codelyzer e repositórios do Porting Assistant para .NET Datastore.

Texto traduzido do Blog original Inglês aqui.

Nota rápida: Atualmente existe uma extensão para visual studio que pode ser conferida aqui.


Autor:

 

Steve Roberts is currently a Developer Advocate focused on .NET and PowerShell development on AWS. Based in Seattle, Washington, Steve worked as a Senior Development Engineer on the AWS SDKs and tools for .NET and PowerShell developers. He was the development lead for the AWS Tools for PowerShell and the AWS Tools for Azure DevOps, and also worked on the AWS Toolkits for Visual Studio, and Visual Studio Code, plus the AWS SDK for .NET. Follow him on Twitter @bellevuesteve.

 

Tradução e Localização:

 

Kevin Lira é arquiteto de soluções da AWS no time de Public Sector com foco em Governo. Com carreira prévia em setores jurídicos, financeiros e startups, Kevin é entusiasta de experiencia de usuário, desenvolvimento web e serverless.

 

 

Revisores

Caio Ribeiro Cesar é arquiteto de solução no setor comercial da AWS.

 

 

 

 


Samir Nassif Palma é gerente senior de arquitetos de soluções no setor público da AWS.