Forçar o recarregamento do arquivo antes da compilação
-
23-09-2019 - |
Pergunta
Temos uma ferramenta que gera alguns arquivos de código (.cs) que são utilizados para construir o projeto.
EDITAR:Esses arquivos são a outra metade de algumas classes parciais, portanto o processo de construção requer acesso à fonte.Não é possível compilá-lo em uma DLL, por exemplo, e depois definir a ordem de construção.
A ferramenta é executada durante a etapa de pré-compilação, mas os arquivos são atualizados na solução somente após a compilação, o que significa que a compilação precisa ser executada duas vezes para limpar os erros após uma alteração na entrada.
Exemplo:
- Modificar arquivo de entrada da ferramenta
- Executar compilação
- A ferramenta executa e altera o arquivo de origem
- Falha na construção
- Executar compilação
- Ferramenta Executa e altera o arquivo de origem (mas na verdade muda, porque a entrada permanece a mesma)
- A construção é bem-sucedida
Alguma idéia de como podemos acabar com a construção dupla e ainda permitir que nossa ferramenta seja executada no VS?
Obrigado rapazes!
Solução 3
A resposta acabou sendo "Use Bolo" e Powershell
Outras dicas
Seria trivial escrever uma macro VS que executasse sua ferramenta e então iniciar uma compilação para que você pudesse ter todo o processo executado com um único toque de tecla, de uma forma mais rápida do que uma compilação dupla.
Alternativamente (ou em conjunto com o acima), você pode adicionar uma ferramenta personalizada ao menu VS Tool que executa sua ferramenta (veja Ferramentas->Ferramentas Externas).Em seguida, basta executar manualmente esta ferramenta personalizada antes de executar a construção - ainda é uma etapa dupla tediosa, mas muito mais rápida e fácil do que construir duas vezes.(e você provavelmente conseguirá deixar sua ferramenta em execução na etapa de pré-construção para que a antiga abordagem de construção dupla ainda funcione).
Outra opção pode ser editar o script MSBuild do seu projeto para executar sua ferramenta anteriormente no processo de compilação, para que a alteração no arquivo seja detectada durante as verificações de dependência (portanto, apenas uma passagem de compilação é necessária).
Nenhuma dessas são ótimas soluções, mas espero que possam lhe dar uma vantagem que proporcione uma melhoria aceitável em relação à sua situação atual.
refatore seu soln em 2 projetos:a primeira geração é o arquivo cs, a segunda o usa (como uma dll).
O primeiro projeto (chame-o de Gen) tem 2 eventos pós-construção:1 para executar a ferramenta e recriar o arquivo fonte e 2) compilar o arquivo Gen'ed src para uso pelo segundo projeto:
Gen.exe
csc.exe /target:library Gened.cs
O segundo projeto (chame-o de Use) faz referência à dll e a chama.
==Gen.cs
using System.IO;
namespace sm3
{class Gen
{static string bod = "public static int var = 46;";
static string clas = "public class Gened {" + bod + "}";
static string ns = "namespace sm3 {" + clas + "}";
static void Main(string[] args)
{StreamWriter SW;
SW = File.CreateText("Gened.cs");
SW.WriteLine(ns);
SW.Close();
}}}
==Usar.cs
using System;
namespace sm3
{class Use
{static void Main(string[] args)
{Gened g = new Gened();
Console.Write(Gened.var.ToString());
Console.ReadLine();
}}}