it-swarm-pt.tech

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

Caso a pergunta não estivesse clara. Eu tenho 3 projetos MVC em uma solução. Toda vez que crio um novo projeto, ele adiciona a pasta "Scripts" a todos os arquivos .js que eu precisarei. Não quero que isso seja criado sempre 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.

70
EKet

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 chamar.

New Solution Folder

Common Javascript Files Solution Folder

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

Open Folder In Windows Explorer

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

Common Javascript Files Directory

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

Add Javascript Files To Directory

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

Visual Studio Add - Existing Itme

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

Select Files To Add

Solution Folder Files

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 Adicionar - Item existente .

Project Add Existing Item

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

Add As Link

Agora, os arquivos nos projetos são essencialmente atalhos para os arquivos na pasta Solução. 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).

Linked Files

PROFISSIONAIS

  • Os arquivos são realmente compartilhados entre os projetos em Tempo de design
  • Somente os arquivos necessários para cada projeto podem ser adicionados, não é tudo ou nada
  • Não requer nenhuma configuração em IIS (diretório virtual etc))
  • Se a solução estiver no controle Origem TFS, você poderá adicionar o Diretório à Origem TFS e os arquivos compartilhados serão controlados na origem.
  • A edição de um arquivo, selecionando-o no Projeto, editará o arquivo real.
  • Excluir um arquivo vinculado não exclui o arquivo.
  • Isso não se limita aos arquivos JS, os arquivos vinculados podem ser [~ # ~] qualquer [~ # ~] arquivo que você possa precisar (Imagens, Css, XML, CS, CSHTML, etc.)

CONTRAS

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

A melhor coisa a fazer, imo, é lançar seu próprio CDN ... Basicamente, basta criar outro site em IIS e atribuir sua própria ligação, por exemplo, " http: // cdn.somedomain.com "

Armazene todas as suas imagens css/js/fonts/shared etc no site da CDN e vincule-as a partir de outros sites.

Fazer 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 dos seus itens para todos os sites que os usam.

Eu adicionei esta resposta porque vejo muitas pessoas referenciando a criação de diretórios virtuais. Embora ele 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 com que seus usuários baixem o jquery.js (1 * número de sites) quando você pode permitir que eles baixem uma vez no (cdn.somedomain.com).

Além disso, quando digo desperdício de largura de banda, não estou falando apenas de largura de banda de servidor, mas de usuários móveis em planos de dados ... Como exemplo, eu acessei o site de RH de nossas empresas (insuficiência, etc.) no meu telefone do outro dia e consumiu 250mb logo de início, baixou o jquery e um monte de coisas 5 vezes cada ... Em um plano de dados de 2 GB por mês, sites que fazem isso realmente me incomodam.

21
Ryan Mann

Aqui está, IMO, a melhor e mais fácil solução, passei uma semana tentando encontrar a melhor e mais fácil maneira 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 -> Eventos de construção -> evento pós-construção:

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

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

Faça o mesmo para o MvcApp2. Agora, após cada compilação, os 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 scripts de todos os aplicativos. Dessa forma, você pode mover alguns scripts para .dll sem precisar alterar nenhum caminho, aqui está um exemplo:

Se você deseja copiar apenas scripts de Recursos/Compartilhado/scripts no MvcApp1/scripts após cada compilação:

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

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

A referência do projeto compartilhado aparece no nó Referências no Solution Explorer, 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, era possível compartilhar o código-fonte entre os projetos em Adicionar -> Item Existente e depois escolher Vincular. Mas isso era meio desajeitado e cada arquivo de origem separado precisava ser selecionados individualmente. Com a mudança para oferecer suporte a várias plataformas diferentes (iOS, Android, etc.), eles decidiram facilitar o compartilhamento de fontes entre projetos, adicionando o conceito de Projetos Compartilhados. "

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

Informações deste tópico:

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

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

4
Ogglas

Uma sugestão que permitirá depurar seus scripts sem recompilar o projeto:

  • Escolha um projeto "master" (que você usará para depuração) e adicione os arquivos físicos a ele
  • Use o recurso "Adicionar como link", conforme descrito na resposta de Eric, para adicionar os arquivos de script aos outros projetos na solução
  • Use a tarefa CopyLinkedContentFiles no Build, conforme sugerido no comentário do Mac para copiar os arquivos para o segundo nos seus projetos adicionais

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

2
DivineOps

Em IIS crie uma pasta virtual apontando para a mesma pasta de scripts para cada um dos 3 aplicativos. Depois, você só precisará mantê-los em um único aplicativo. Existem outras alternativas, mas realmente depende de como seus aplicativos estão estruturados.

Editar

Uma idéia mais assustadora é usar o Areas. Em uma área comum, tenha um diretório de scripts com os scripts definidos para serem compilados. Em seguida, sirva-os, tirando-os da DLL. Pode ser uma boa ideia se você prever que a Área comum tenha mais funcionalidades posteriormente.

2
Yuriy Faktorovich

A maioria dos arquivos incluídos por padrão também está disponível em várias 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

1
jbrunken