Typescript: Opção "Sem compilar" do Visual Studio

Criado em 11 mar. 2015  ·  29Comentários  ·  Fonte: microsoft/TypeScript

Oi,

Recentemente, desenvolvemos um aprimoramento para o plug-in grunt-ts que permite direcionar um arquivo de projeto do Visual Studio para caminhos de arquivo TS de entrada e informações de configuração de TS ao invés de ter que usar src: e outras opções. https://github.com/TypeStrong/grunt-ts/pull/215

O Grunt-ts junto com o Task Runner Explorer permite que os desenvolvedores usem recursos ainda não suportados pela IU de configuração de compilação do projeto Visual Studio TypeScript (como preserveConstEnums).

Uma coisa sobre o uso do Task Runner Explorer é que ele só pode se conectar a determinados eventos do Visual Studio. Entre eles estão "após a construção" e "antes da construção". O after build funciona muito bem, mas tem o estranho problema de VS fazer sua própria etapa de compilação do TypeScript seguida por grunt-ts chamando tsc. Isso não parece ser um problema, exceto para o desempenho (o trabalho que o VS está fazendo para compilar e emitir é um esforço desperdiçado e o desenvolvedor tem que esperar mais tempo pelo resultado desejado).

Estou imaginando qual seria a melhor maneira de desligarmos _apenas_ a compilação / emissão no Visual Studio para TypeScript, mas manter tudo o mais igual (serviço de linguagem / destaque de sintaxe, lista de erros, construção de C # ou VB, etc). Isso é possível atualmente? Se não, pode ser?

Obrigado!

Question

Comentários muito úteis

Apenas para sua informação, no VS2015 RTM há uma maneira mais fácil de desativar o TypeScriptCompile:
Basta adicionar <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> a .csproj , por exemplo, no primeiro <PropertyGroup> .

Todos 29 comentários

Olá, há poucos dias enviei o problema nº 2252 que está relacionado a isso. Preciso de alguma forma de acionar eventos pré e pós-compilação ao usar compilar ao salvar para um projeto de TS com uma única saída de arquivo (enquanto ainda mantém os comandos usuais "Build" e "Rebuild" do VS, serviço de linguagem, depuração, etc. .). Como solução alternativa, estou usando o Task Runner Explorer com grunt-contrib-watch (iniciado usando uma ligação de "Solution Open") para observar o arquivo compilado quanto a alterações e executar ações adicionais sempre que ele é modificado.

No entanto, não acho isso muito satisfatório (eu também preciso realizar algumas ações de pré-compilação e geralmente prefiro ter todas as etapas de compilação feitas usando Grunt ou todas com VS) e considere fazer exatamente o que está descrito: Desligue completamente a compilação do VS e implementar uma compilação ao salvar, compilações completas personalizadas (que incluem a execução de testes de unidade, etc.), eventos pré e pós-compilação com uma combinação de grunt-contrib-watch, grunt-ts, plug-ins adicionais de grunt e Task Runner Explorer .

(atualização: já implementou isso e funciona bem - executa um script de compilação grunt personalizado toda vez que um arquivo .ts é modificado, embora atualmente não suporte as ligações TRE "Before Build" e "After Build" - para o acima mencionado razões).

Parece que a maneira mais fácil (e menos envolvente para desenvolvedores de plug-ins TS) de permitir com eficiência esses tipos de cenários de compilação seria fornecer uma opção para desligar qualquer forma de compilação iniciada pelo Visual Studio. Eu também gostaria de receber alguma ideia sobre como fazer isso?

Não sei se existe uma ótima opção para você agora. Se você definir cada arquivo .ts no projeto para ter Build Action: None em suas propriedades, isso provavelmente faria o que você deseja, mas é muito oneroso fazer manualmente, mesmo em projetos de médio porte.

A compilação é derivada de destinos em projetos MSBuild. Se você deseja desabilitar a construção do texto digitado padrão, remova a referência aos destinos do texto digitado do seu arquivo.

Isso fará com que seu serviço de idioma não reúna todos os arquivos do projeto em um contexto. Eu diria que está tudo bem, e no próximo lançamento devemos ter suporte tsconfig e então este se torna seu novo projeto. Se você ainda deseja fazê-lo funcionar sem usar tsconfig e / ou esperar pelo próximo lançamento, defina uma propriedade <TypeScriptEnabled>true</TypeScriptEnabled> em seu arquivo de projeto.

@mhegazy , você quis dizer <TypeScriptEnabled>false</TypeScriptEnabled> ?

bem, dependendo do que você quer :)

se você quiser desligar o carregamento de conteúdo do projeto de serviço de linguagem, torne-o falso,
se quiser habilitá-lo, torne-o verdadeiro. já está habilitado incluindo os destinos padrão (Microsoft.TypeScript.targets)

OK, vou mexer com isso. Obrigado!

Obrigado @mhegazy , a opção de configuração parece funcionar até agora! (enquanto ainda mostra erros de sintaxe / complie e permite a depuração no IE) e pode até mesmo ser definido para uma configuração de solução específica (eu tentei e parecia funcionar), assim:

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
...
    <TypeScriptEnabled>false</TypeScriptEnabled>
...
</PropertyGroup>

Não tenho certeza, porém, do que significa "desativar o carregamento do conteúdo do projeto de serviço de idioma"? (Não estou muito familiarizado com os conceitos do VS, como alvos, contextos, etc.). Pelo que testei, tudo parece funcionar normalmente com essa opção (exceto o comportamento esperado de não compilar na compilação)? E parece que ainda adicionará entradas <TypeScriptCompile Include=".."/> para arquivos .ts recém-adicionados / criados na configuração do projeto.

Em uma nota lateral, agora com tudo feito através do Grunt, eu de alguma forma tenho que encontrar uma maneira de lidar com as colisões entre compilações acionadas por grunt-watch e eventos vinculados "Before Build" / "After Build" ao invocar o VS Build Comandos Rebuild , já que o VS salva automaticamente antes do início da construção, levando a duas instâncias diferentes do Grunt rodando desnecessariamente em paralelo.

Não consegui fazer <TypeScriptEnabled>false</TypeScriptEnabled> funcionar (VS 2013 Atualização 4 com TypeScript 1.4), mas remover o arquivo de destinos do TypeScript do projeto desabilitou a compilação no projeto Build.

Aqui estão as etapas completas necessárias para desabilitar a compilação TypeScript no VS (embora ainda tenha os serviços de linguagem funcionando, continue a refatoração feliz, etc.):

  • Remova a referência ao arquivo ".targets" do TypeScript do arquivo de projeto.
  • Desative "Compilar automaticamente arquivos TypeScript que não fazem parte de um projeto" nas opções do Visual Studio TypeScript.

A segunda etapa é uma espécie de bug (ou pelo menos a caixa de diálogo não é rotulada de maneira estritamente precisa); Mesmo que seus arquivos TypeScript sejam "parte" de um projeto, se você desabilitar o arquivo de destino, Visual Studio 2013 os tratará como se _não_ fizessem parte de um projeto e os compilarão ao salvar (se a opção global não estiver definida). Não consegui que <TypeScriptEnabled/> fizesse nada.

Obrigado @mhegazy - seria incrível se isso pudesse fazer parte da caixa de diálogo de opções do TypeScript, mas pelo menos é bastante fácil de suportar através da edição do projeto.

uma coisa complicada é que <TypeScriptEnabled>false</TypeScriptEnabled> precisa estar no final do seu arquivo, especificamente após a importação para os destinos. como os destinos o definem de qualquer maneira, e você deseja substituí-lo.

uma coisa complicada éfalso precisa estar no final do arquivo, especificamente após a importação para os destinos. como os destinos o definem de qualquer maneira, e você deseja substituí-lo.

Você está exatamente certo! Esse era o truque.

Acho que isso resolve o problema. Obrigado, @mhegazy .

Olá @mhegazy - desculpe incomodá-lo. Tem certeza de que <TypeScriptEnabled>false</TypeScriptEnabled> funciona no VS 2013 com TypeScript 1.4 instalado? Acabei de atualizar meu PC atual do VS 2013 com TS 1.3 (direto VS 2013 Atualização 4) para o VS 2013 com TS 1.4, e agora o Visual Studio está tentando construir o TypeScript novamente "na construção" (o que significa que os erros que aparecem têm "Build : "na frente deles), embora as últimas cinco linhas dos meus projetos sejam as seguintes:

  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  <PropertyGroup>
    <TypeScriptEnabled>false</TypeScriptEnabled>
  </PropertyGroup>
</Project>

Ele estava funcionando corretamente nesta máquina hoje (quando fechei este tíquete), mas agora que coloquei 1.4 aqui, o Build do VS está me apresentando erros. Comentar a referência ao arquivo de destino (e desativar "compilar ao salvar" para o TypeScript que não está em um projeto) ainda o desativa.

Eu tenho 1.4 em casa e não consegui fazer <TypeScriptEnabled>false</TypeScriptEnabled> funcionar lá - estou me perguntando se houve uma regressão nesta opção de compilação?

<TypeScriptEnabled>false</TypeScriptEnabled> não tem nada a ver com construção. trata-se de Language Service tratando seus arquivos como parte de um projeto ou não.

se você não deseja obter a construção em F5, remova a referência aos destinos.

Essa foi a resposta curta, aqui está a versão longa:

O arquivo de projeto é usado para duas coisas:

  1. build, este é o seu suporte MSBuild normal, em que os alvos chamam tarefas e o sistema encontra entradas, alvos correspondentes e os executa em ordem. então, tudo o que isso faz é agregar todos os itens TypeScriptCompile no projeto, passá-los para tsc.exe junto com algumas opções.
    Além disso, as páginas de propriedades do projeto são derivadas de seu arquivo de projeto e são apenas UI sobre propriedades do MSBuild.
  2. serviço de linguagem, este é seu preenchimento, ajuda de assinatura, erros no VS, compilar ao salvar .. etc. queremos que eles funcionem da mesma forma que sua compilação normal, então procuramos as mesmas propriedades que você define para compilar e conduzir o Comportamento LS. por exemplo, se seu destino estiver definido como ES3 em seu arquivo de projeto ( <TypeScriptTarget>ES3</TypeScriptTarget> ), seu serviço de idioma apresentará um rabisco vermelho se você definir get / set em uma classe.
    Isso permite que você use um conjunto de opções para o comportamento de tempo de construção e design.
    Para que isso funcione, o destino informa ao serviço de linguagem que ele sabe sobre o texto digitado, definindo uma propriedade <TypeScriptEnabled>true</TypeScriptEnabled> .

Se você não quiser que a construção no VS funcione, apenas remova os alvos. isso desabilitará a compilação, mas também dirá ao LS que este projeto não é um projeto TypeScript. e tratará todos os arquivos como "arquivos soltos". se estiver tudo bem para você, nenhum trabalho será necessário. se você quiser mudar isso e fazê-lo ainda usar as propriedades do seu arquivo de projeto, e não incluir outros arquivos abertos em seu projeto, etc. então adicione <TypeScriptEnabled>true</TypeScriptEnabled> ao seu arquivo, e o LS irá tratá-lo de acordo .

Se você deseja que a construção funcione no VS, mas o LS não o trate como um projeto, defina o sinalizador como falso.

Obrigado. Esta é uma ótima informação e tudo parece funcionar de forma consistente com o que você descreveu. Se eu removi o arquivo .targets, mas defini TypeScriptEnabled como true, é esperado que a guia TypeScript Build desapareça das propriedades do projeto?

  <!--
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  -->
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>
</Project>

Em caso afirmativo, isso parece estranho porque significa que não haveria maneira de controlar as configurações que estavam acessíveis na IU sem reativar o destino e, em seguida, usar a IU (ou, de forma mais realista, apenas editar a configuração do projeto TS diretamente naquele ponto desde você está lá de qualquer maneira).

A razão de estar perguntando tudo isso é que escrevi uma biblioteca npm algumas semanas atrás para ler as propriedades de construção do TypeScript de um .csproj e .vbproj (https://www.npmjs.com/package/csproj2ts) que eu estou atualmente integrando em grunt-ts. Quando estiver pronto, haverá uma maneira fácil de efetivamente "executar tsc em um arquivo .csproj" (conforme solicitado aqui: https://github.com/Microsoft/TypeScript/issues/1702). Eu quero ser capaz de dizer às pessoas a melhor maneira de configurar seu projeto para usar o serviço de linguagem VS TypeScript para sua experiência de codificação, mas usar inteiramente grunt-ts para construção. Eu esperava que fosse possível permitir que as pessoas usassem a IU para configurar as propriedades do TypeScript neste cenário, mas talvez não seja.

Você conhece uma maneira de exibir a guia TypeScript Build com o arquivo TypeScript .targets desativado?

Além disso, parece que mesmo se eu fizer algo assim: <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition=" '$(Configuration)' == 'Debug' " /> , tenho que definir a configuração do projeto para Depurar e recarregar para que a guia Build do TypeScript apareça.

Desculpe, @mhegazy - eu prometo que não estou

é esperado que a guia Build TypeScript desapareça das propriedades do projeto?

sim, as páginas de propriedades são conectadas aos destinos, portanto, removê-las remove a IU, você terá que editar manualmente o arquivo

A razão de estar perguntando tudo isso é que escrevi uma biblioteca npm algumas semanas atrás para ler as propriedades de construção do TypeScript de um .csproj e .vbproj (https://www.npmjs.com/package/csproj2ts) que eu estou atualmente integrando em grunt-ts.

O cenário que você está tentando alcançar é factível, mas terá algumas arestas e você precisará hackear alguns lugares para fazê-lo funcionar. @paulvanbrenk está atualmente adicionando suporte para tsconfig no VS, isso permite que as páginas de propriedades do projeto usem o arquivo tsconfig se ele estiver lá. Também estamos trabalhando em uma integração melhor em projetos ASP.net 5 , que acredito que farão tudo o que você quiser, a saber: 1. suporte grubt / bower, 2. uma visão baseada no sistema de arquivos, 3. usar tsconfig para gerenciar as propriedades do projeto e 4. interação simples com outros editores / IDEs. Eu acredito que isso funcionará bem com o cenário que você está descrevendo e você não terá que hackear seu caminho para contorná-lo. isso virá no próximo lançamento, portanto, alguma espera está envolvida :)

Além disso, parece que até mesmo se eu fizer algo assim: , Tenho que definir a configuração do projeto como Depurar e recarregar para que a guia Build do TypeScript apareça.

As importações são carregadas quando o projeto é carregado. portanto, nesta importação, você está dizendo carregado apenas em 'Configuração' 'Depurar', alterar a configuração não força um recarregamento.

Desculpe, @mhegazy - eu prometo que não estou
: D não se preocupe. sempre adoro receber feedback e espero que tenha ajudado.

ESTÁ BEM. Na verdade, obrigado por essas informações excelentes e discussão completa.

Apenas para jogar isso lá fora para @paulvanbrenk - seria incrível ter algum tipo de maneira, mesmo no estado futuro com tsconfig para ter a capacidade de desabilitar a compilação do VisualStudio TypeScript (significando CTRL + SHIFT + B constrói seu C # e etc, mas não TypeScript) e usa um compilador TypeScript externo, deixando a capacidade de definir opções de TypeScript por meio da GUI. Existem muitas razões pelas quais usar uma ferramenta de compilação externa pode ser muito útil e agora parece que isso só é possível por acidente e com algumas arestas.

A ideia tsconfig é incrível, mas realmente não ajuda com:

  • Usando uma versão antiga do TypeScript
  • Usando diferentes versões do TypeScript em diferentes projetos no mesmo computador
  • Utilizando uma versão experimental do texto dactilografado (tal como a versão de @fdecampredon que suportes JSX)
  • Usando uma ferramenta de compilação como grunt-ts que automatiza o gerenciamento de referência e faz outras tarefas que o TypeScript não suporta
  • Etc.

Permitir que os usuários do Visual Studio escolham um sistema compilador TypeScript desenvolvido pela comunidade e, ao mesmo tempo, mantendo a bela IU dentro do Visual Studio, seria incrível (especialmente com o complemento Task Runner Explorer). Espero que você pondere os benefícios significativos para a comunidade que isso permitiria em relação ao tempo que levaria para codificar uma caixa de seleção que diz "Desativar Build TypeScript".

Espero que você pondere os benefícios significativos para a comunidade que isso permitiria em relação ao tempo que levaria para codificar uma caixa de seleção que diz "Desativar Build TypeScript".

Esta é a parte em que fico confuso. para mim, isso é remover a referência de alvos de texto digitado e, em seguida, substituí-la por seus alvos grunhidos que construirão as coisas de maneira diferente. parece estranho para mim incluir um arquivo .targets com uma condição que o diz para não fazer nada; por que incluí-lo em primeiro lugar? Eu ficaria feliz em ajudar a compor um arquivo .targets que substitua os destinos de texto digitado padrão, este incluirá a tag <TypeScriptEnabled>true</TypeScriptEnabled> e parecerá para o VS como se fosse o padrão, mas irá lidar com a construção de forma diferente.

Hã. Eu deveria ter pensado nisso - acho que estou tratando o arquivo .targets como algo imutável, mas é claro que faz todo o sentido. Vou olhar para o formato do arquivo de destino e voltar para você.

uma maneira fácil de começar é copiar o arquivo de destino Microsoft.TypeScript.Target, remover coisas que você não se preocupa, por exemplo, chamar tsc e adicionar tarefas para chamar grunt e conectar na configuração, etc. e incluí-lo em seu projecto.

Impressionante! Eu fiz tudo funcionar de uma perspectiva minimalista, definindo meu arquivo .csproj com as seguintes 4 linhas.

  <Import Project="$(ProjectDir)\custom.TypeScript.targets" />
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>

E o arquivo custom.TypeScript.targets minimalista é este:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VsToolsPath Condition="'$(VsToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VsToolsPath>
  </PropertyGroup>
  <UsingTask TaskName="TypeScript.Tasks.VsTsc" AssemblyFile="$(VSToolsPath)\TypeScript\TypeScript.tasks.dll" />
  <PropertyGroup>
    <CfgPropertyPagesGuidsAddCSharp>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddCSharp>
    <CfgPropertyPagesGuidsAddVB>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddVB>
    <CfgPropertyPagesGuidsAddTypeScript>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddTypeScript>
  </PropertyGroup>
  <ItemGroup>
    <ProjectCapability Include="TypeScript" />
  </ItemGroup>
</Project>

Tentei colocar a tag <TypeScriptEnabled /> no arquivo de destino, mas não estava funcionando (o VS estava tratando os arquivos .ts como soltos). Alguma ideia do porquê? (Tenho certeza de que para alguém que conhece o MSBuild isso é óbvio - talvez algum tipo de problema de escopo?).

Acho que isso resolve meu problema neste momento. Posso executar minha tarefa Grunt usando a extensão Task Runner Explorer, que pode iniciar as tarefas Grunt ou Gulp quando um VS Build é disparado. A construção agora sempre mostra como tendo êxito, independentemente do resultado da compilação do TypeScript, mas isso é bom, pois o usuário pode ver a saída de grunt-ts na janela TRX. O painel "TypeScript Build" aparece na janela de propriedades do projeto. Compilar ao salvar funciona se essa opção for selecionada. A compilação ainda mostra como falhou se o código C # ou VB não compilar com êxito (uma coisa boa). A configuração para chegar aqui a partir de um "aplicativo HTML com TypeScript" ou projeto da web ASP.NET padrão do Visual Studio é bastante simples.

Você pode ver algum problema com a distribuição do arquivo .targets minimalista acima com o grunt-ts? Isso significaria que apenas teríamos que dizer às pessoas para atualizarem a linha .targets de seus projetos para <Import Project="$(ProjectDir)\node_modules\grunt-ts\custom.TypeScript.targets" /> e definir <TypeScriptEnabled> .

Obrigado novamente!!

Eu tentei colocar o no arquivo de destino, mas não estava funcionando (o VS estava tratando os arquivos .ts como soltos). Alguma ideia do porquê? (Tenho certeza de que para alguém que conhece o MSBuild isso é óbvio - talvez algum tipo de problema de escopo?).

isto é estranho. é assim que temos em nossos alvos e funciona bem. você está incluindo outros alvos que possui a propriedade? quaisquer condições? eu tentei em um novo projeto ts, removi o Microsoft.TypeScript.targets, coloquei o seu e adicioneiverdadeiro e funcionou.

Você pode ver algum problema com a distribuição do arquivo .targets minimalista acima com o grunt-ts? Isso significaria que só teríamos que dizer às pessoas para atualizarem a linha .targets de seus projetos para E definir.

Acho que esse é o caminho correto a seguir. Eu apenas tentaria obter o TypeScriptEnabled lá também. deixe-me saber como posso ajudar a diagnosticar o problema

Algumas notas, você não precisa da referência de tasks.dll nem da definição de VsToolsPath, a menos que você precise para outra coisa.

Estou vendo o comportamento que você previu no meu computador doméstico. Também funcionou sem a referência à DLL. Devo ter cometido algum tipo de erro antes, então tentarei novamente amanhã. Eu acho isso realmente ótimo! Obrigado, Mohamed. Isso deve ser lançado como parte do grunt-ts nos próximos dias.

uma coisa que pode estar causando isso é que os arquivos de destino são carregados apenas uma vez no VS, portanto, se você editar os destinos, as alterações não serão refletidas em seu projeto até que você reinicie o VS.

Poderia ter sido isso; Eu estava apenas descarregando / recarregando o projeto. É possível que reiniciei o VS em casa. Vou anotar isso na documentação.

@mhegazy Obrigado por toda a sua ajuda. Lançamos o grunt-ts 4.0.0 que contém o recurso "compilar do projeto Visual Studio":

https://github.com/TypeStrong/grunt-ts#vs

Instruções para desativar a construção do VS:

https://github.com/TypeStrong/grunt-ts/blob/master/docs/DisableVisualStudioBuild.md

Muito legal! Eu amo os cenários que isso possibilita.

Obrigado, Ryan. Estou bastante satisfeito com o resultado. Quando tsconfig acontecer, pode ser menos necessário, mas isso vai preencher a lacuna até então e, claro, é compatível com versões do compilador TypeScript anteriores a 1.5.

PS: Houve dois relatórios de bug hoje, então devemos lançar um 4.0.1 hoje à noite, supondo que eu consiga corrigi-los.

Apenas para sua informação, no VS2015 RTM há uma maneira mais fácil de desativar o TypeScriptCompile:
Basta adicionar <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked> a .csproj , por exemplo, no primeiro <PropertyGroup> .

Obrigado.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

MartynasZilinskas picture MartynasZilinskas  ·  3Comentários

DanielRosenwasser picture DanielRosenwasser  ·  3Comentários

weswigham picture weswigham  ·  3Comentários

dlaberge picture dlaberge  ·  3Comentários

zhuravlikjb picture zhuravlikjb  ·  3Comentários