Como você compartilha scripts entre vários projetos em uma solução?

Caso a pergunta não fosse clara. Eu tenho 3 projetos MVC em uma solução. Toda vez que eu criar um novo projeto, ele adiciona a pasta “Scripts” com todos os arquivos .js que eu precisarei. Eu não quero que isso seja criado toda vez para cada aplicativo. Existe uma maneira de fazer referência a scripts de uma pasta central na solução para que todos os aplicativos / projetos possam compartilhar uma pasta de script comum com todos os scripts comuns entre eles?

Edit: Por favor, explique os prós e contras de fazer isso, se houver algum … agora estou curioso.

Aqui está o que eu recomendaria:

Clique com o botão direito do mouse na solução e crie uma nova pasta de solução chamada Common Javascript Files (ou o que você quiser chamá-la).

Nova pasta de solução

Pasta de Solução de Arquivos Javascript Comum

Clique com o botão direito na solução, clique em Abrir pasta no Windows Explorer ou navegue manualmente para outras versões do Visual Studio 🙁

Abrir pasta no Windows Explorer

No diretório de soluções, crie um diretório com o mesmo nome da pasta da solução (normalmente, as pastas de solução não correspondem aos diretórios no nível do código-fonte, mas isso por questões de integridade).

Diretório Comum de Arquivos Javascript

Neste novo diretório, adicione arquivos que precisam ser compartilhados entre as soluções.

Adicionar arquivos Javascript ao diretório

No Visual Studio, clique na pasta da solução e selecione AddExisting Item .

Visual Studio Add - existente Itme

Na checkbox de diálogo de seleção de arquivos, navegue até o diretório criado anteriormente, selecione o (s) arquivo (s) adicionado (s) ao diretório e clique em Adicionar .

Selecione arquivos para adicionar

Arquivos de pasta de solução

Em cada projeto que precisa de um arquivo compartilhado, clique com o botão direito do mouse no projeto (ou diretório dentro do projeto) e clique em AddExisting Item .

Projeto Adicionar Item Existente

Navegue até o diretório compartilhado, selecione os arquivos e clique na seta suspensa e, em seguida, clique em Adicionar como link .

Adicionar como link

Agora os arquivos nos projetos são essencialmente atalhos para os arquivos na Pasta de Soluções. Mas eles são tratados como arquivos reais no projeto (isso inclui arquivos .CS ou Visual Basic, eles serão compilados como arquivos que realmente existem no projeto).

Arquivos Vinculados

PROS

  • Os arquivos são realmente compartilhados entre projetos no tempo de design
  • Apenas os arquivos necessários para cada projeto podem ser adicionados, não é tudo ou nada
  • Não requer nenhuma configuração no IIS (diretório virtual, etc)
  • Se a solução estiver no controle de origem do TFS, você poderá adicionar o diretório à fonte do TFS e os arquivos compartilhados serão controlados por fonte.
  • Editar um arquivo selecionando-o no Projeto, editará o arquivo real.
  • A exclusão de um arquivo vinculado não exclui o arquivo.
  • Isso não está limitado a arquivos JS, arquivos vinculados podem ser QUALQUER arquivo que você possa precisar (Imagens, Css, Xml, CS, CSHTML, etc)

CONS

  • Cada implantação obtém seu próprio arquivo.
  • Há uma pequena curva de aprendizado ao entender que as Pastas de Soluções não são Diretórios existentes em um Diretório de Soluções.

A melhor coisa a fazer, imo, é rolar seu próprio CDN … Basicamente, basta criar outro site no IIS e dar-lhe sua própria binding, por exemplo, ” http://cdn.somedomain.com

Em seguida, armazene todas as suas imagens css / js / fonts / shared etc no site da CDN e faça um link para elas a partir de seus outros sites.

Isso resolve 2 problemas,

  1. Todas as suas coisas são compartilhadas quando necessário e você só precisa gerenciar 1 revisão por arquivo.
  2. Os navegadores dos usuários podem armazená-los em cache em um único local, em vez de fazer o download de cópias de seus itens para todos os sites que os usam.

Eu adicionei essa resposta porque vejo muitas pessoas referenciando a criação de diretórios virtuais. Embora isso realmente compartilhe os arquivos, ele cria vários caminhos de download para eles, o que é um desperdício extremo de largura de banda. Por que fazer seus usuários fazerem download de jquery.js (1 * número de sites) quando você puder fazer o download deles uma vez (cdn.somedomain.com).

Além disso, quando eu digo desperdício de largura de banda, eu não estou falando apenas sobre largura de banda do servidor, estou falando sobre os usuários móveis em planos de dados … Como exemplo, eu acertar o site de RH de nossas empresas (etc) no meu telefone o outro dia e consumiu 250MB para a direita fora do portão, baixado jquery e um monte de coisas 5 vezes cada … Em um plano de dados de 2GB por mês, sites que realmente me incomodam.

Aqui vai, IMO a solução melhor e mais fácil, passei uma semana tentando encontrar a maneira melhor e mais fácil que sempre teve mais contras do que profissionais:

 Resources(DLL) Shared images image.png css shared.css scripts jquery.js MvcApp1 Images Content Shared < - We want to get files from above dll here ... MvcApp2 Images Content Shared <- We want to get files from above dll here ... 

Adicione o seguinte ao MvcApp1 -> Projeto -> Propriedades do MvcApp1 -> Criar events -> evento pós-compilation:

 start xcopy "$(SolutionDir)Resources\Shared\*" "$(SolutionDir)MvcApp1\Shared" /r /s /i /y 

Aqui está uma explicação sobre o que faz: Incluir o diretório de arquivos de conteúdo de ação Build do assembly referenciado no mesmo nível do diretório bin

Faça o mesmo para o MvcApp2. Agora, após cada compilation, novos arquivos estáticos serão copiados para o seu aplicativo e você poderá acessar arquivos como "~ / Shared / css / site.css"

Se você quiser, pode ajustar o comando acima para copiar scripts de .dll para a pasta de scripts de cada aplicativo, dessa forma você pode mover alguns scripts para .dll sem ter que alterar nenhum caminho, aqui é exemplo:

Se você deseja copiar somente scripts de Recursos / Compartilhados / scripts em MvcApp1 / scripts após cada construção:

 start xcopy "$(SolutionDir)Resources\Shared\Scripts\*" "$(SolutionDir)MvcApp1\Scripts" /r /s /i /y 

Esta é uma resposta tardia, mas a Microsoft adicionou um tipo de projeto chamado Shared Project iniciando o Visual Studio 2013 Update 2 que pode fazer exatamente o que você quer, sem ter que link arquivos.

A referência de projeto compartilhado aparece no nó Referências no Gerenciador de Soluções, mas o código e os ativos no projeto compartilhado são tratados como se fossem arquivos vinculados ao projeto principal.

“Nas versões anteriores do Visual Studio, você podia compartilhar o código-fonte entre os projetos por Add -> Existing Item e depois escolher Link. Mas isso era meio desajeitado e cada arquivo de origem separado tinha que ser selecionado individualmente. plataformas diferentes (iOS, Android, etc), eles decidiram facilitar o compartilhamento de fonts entre projetos, adicionando o conceito de Projetos Compartilhados. “

https://blogs.msdn.microsoft.com/sumsegar/2014/04/02/visual-studio-2013-update-2-rc-windows-phone-8-1-tools-shared-projects-and-universal- windows-apps /

Informações desta discussão:

Qual é a diferença entre um projeto compartilhado e uma biblioteca de classs no Visual Studio 2015?

https://stackoverflow.com/a/30638495/3850405

No IIS, crie uma pasta virtual apontando para a mesma pasta de scripts para cada um dos três aplicativos. Então você só precisa mantê-los em um único aplicativo. Existem outras alternativas, mas realmente depende de como seus aplicativos são estruturados.

Editar

Uma ideia mais assustadora é usar Áreas. Em uma área comum, tem um diretório de scripts com os scripts definidos para serem compilados. Em seguida, sirva-os, tirando-os da dll. Isso pode ser uma boa ideia se você prever que a área comum terá mais funcionalidades posteriormente.

Uma sugestão que permitirá que você depure seus scripts sem recompilar o projeto:

  • Escolha um projeto ” mestre ” (que você usará para debugging) e adicione os arquivos físicos a ele
  • Use o recurso “Add As Link” conforme descrito na resposta de Eric para adicionar os arquivos de script aos outros projetos em solução.
  • Use CopyLinkedContentFiles tarefa no Build, como sugerido no comentário do Mac para copiar os arquivos para o segundo para seus projetos adicionais

Desta forma você pode modificar os scripts no projeto ” mestre ” sem reiniciar o depurador, o que para mim faz o mundo da diferença.

A maioria dos arquivos incluídos por padrão também está disponível em vários CDNs.

Se você não estiver adicionando seus próprios scripts personalizados, talvez nem precise de um diretório de scripts.

CDN da Microsoft para scripts: http://www.asp.net/ajaxlibrary/cdn.ashx