Como você inclui arquivos adicionais usando os pacotes de implantação da web do VS2010?

Estou testando usando a nova funcionalidade de empacotamento da web no visual studio 2010 e me deparei com uma situação em que uso um evento de pré-compilation para copiar os arquivos .dll necessários para minha pasta bin na qual meu aplicativo depende de chamadas de API. Eles não podem ser incluídos como referência, pois não são dlls COM que podem ser usados ​​com interoperabilidade.

Quando eu construo meu pacote de implantação, esses arquivos são excluídos quando escolho a opção de include apenas os arquivos necessários para executar o aplicativo. Existe uma maneira de definir as configurações de implantação para include esses arquivos? Não tive sorte em encontrar uma boa documentação sobre isso.

    Ótima pergunta. Acabei de postar uma input de blog muito detalhada sobre isso na Ferramenta de Implantação da Web (MSDeploy): Pacote de Construção incluindo arquivos extras ou excluindo arquivos específicos .

    Aqui está a sinopse. Depois de include arquivos, mostro como excluir arquivos também.

    Incluindo arquivos extras

    Inclusão de arquivos extras no pacote é um pouco mais difícil, mas ainda não há bigee se você estiver confortável com o MSBuild, e se você não estiver, leia isto. Para fazer isso, precisamos nos conectar à parte do processo que coleta os arquivos para empacotamento. O alvo que precisamos estender é chamado de CopyAllFilesToSingleFolder. Esse destino tem uma propriedade de dependência, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, que podemos acessar e injetar nosso próprio destino. Então vamos criar um alvo chamado CustomCollectFiles e injetar isso no processo. Conseguimos isso com o seguinte (lembre-se após a declaração de importação).

      CustomCollectFiles; $(CopyAllFilesToSingleFolderForPackageDependsOn);   CustomCollectFiles; $(CopyAllFilesToSingleFolderForMsdeployDependsOn);   

    Isso adicionará nosso alvo ao processo, agora precisamos definir o alvo em si. Vamos supor que você tenha uma pasta chamada Extra Files, que fica 1 nível acima do seu projeto da web. Você deseja include todos esses arquivos. Aqui está o alvo CustomCollectFiles e discutiremos depois disso.

       <_customfiles Include="..\Extra Files\**\*">  Extra Files\%(RecursiveDir)%(Filename)%(Extension)    

    Aqui o que eu fiz foi criar o item _CustomFiles e no atributo Include disse para pegar todos os arquivos naquela pasta e qualquer pasta abaixo dela. Se por acaso você precisar excluir algo dessa lista, adicione um atributo Exclude a _CustomFiles .

    Então eu uso este item para preencher o item FilesForPackagingFromProject. Este é o item que o MSDeploy realmente usa para adicionar arquivos extras. Observe também que declarei o valor DestinationRelativePath de metadados. Isso determinará o caminho relativo que será colocado no pacote. Eu usei a instrução Extra Files% (RecursiveDir)% (Filename)% (Extension) aqui. O que isso está dizendo é colocá-lo no mesmo local relativo no pacote que está na pasta Extra Files.

    Excluindo arquivos

    Se você abrir o arquivo de projeto de um aplicativo da Web criado com o VS 2010 na parte inferior, você encontrará uma linha com.

      

    BTW você pode abrir o arquivo de projeto dentro do VS. Clique com o botão direito do mouse no projeto de seleção Unload Project. Em seguida, clique com o botão direito no projeto descarregado e selecione Editar projeto.

    Esta declaração includeá todos os alvos e tarefas de que precisamos. A maioria das nossas personalizações deve ser depois dessa importação, se você não tiver certeza se depois disso! Portanto, se você tiver arquivos para excluir, há um nome de item, ExcludeFromPackageFiles, que pode ser usado para fazer isso. Por exemplo, digamos que você tenha o arquivo chamado Sample.Debug.js, incluído em seu aplicativo da Web, mas deseja que esse arquivo seja excluído dos pacotes criados. Você pode colocar o snippet abaixo após essa declaração de importação.

       Project   

    Ao declarar o preenchimento desse item, os arquivos serão excluídos automaticamente. Observe o uso dos metadados do FromTarget aqui. Eu não vou entrar nisso, mas você deve saber sempre especificar isso.

    Uma solução mais simples é editar o arquivo csproj para include a dll necessária na pasta bin e criar um destino antes da construção para copiar o item para a pasta bin da pasta da biblioteca comum, onde armazenamos as dlls de terceiros. Como o item existe no arquivo de solução, ele é implementado por msbuild / msdeploy e nada complicado é necessário.

    Tag usada para include o arquivo sem adicionar através do VS (que vai querer adicioná-lo ao seu VCS normalmente)

     false 

    Este é o alvo BeforeBuild que funcionou para mim:

         

    Editado para include a sugestão do @tuespetre para ocultar a input, removendo assim a desvantagem anterior de uma pasta de bin visível. Não verificado por mim.

    Assim como @toxaq, mas uma solução ainda mais simples é:

    No explorador de soluções, inclua o arquivo como um link para a pasta library / references e, em seguida, nas propriedades, configure-o para ser copiado para a saída da construção.

    Então a implementação de Sayed não funcionou para mim. Estou usando o VS2013 e usando o pacote do Web Deploy e preciso adicionar algumas DLLs de plug-ins de outra pasta no compartimento do pacote de implantação. Aqui está como consegui fazê-lo funcionar (muito mais fácil):

    Na parte inferior do seu arquivo csproj, adicione:

           

    Outros itens de destaque no arquivo csproj:

      pdbonly true bin\ TRACE prompt 4 true Package Default Web Site/MyWebsite ..\output\Service\Service\Service.Release.zip OnlyFilesToRunTheApp true false   

    Queria comentar para enfatizar o comentário de Emil Lerch acima. Se você instalou um SDK do Azure, procure uma DependencyProperty diferente.

    Basicamente, você pode precisar usar “CopyAllFilesToSingleFolderForMsdeployDependsOn” em vez de “CopyAllFilesToSingleFolderForPackageDependsOn” .Eu não sou realmente um cara avançado de MsBuild e eu perdi horas puxando meu cabelo tentando determinar porque meus alvos não estavam sendo chamados.

    Este é outro link, caso isso não funcione para você e você tenha instalado um SDK do Azure: http://forums.iis.net/t/1190714.aspx

    Como um adendo à resposta de Sayed, descobri que uma declaração estática de itens ExcludeFromPackageFiles dentro do meu projeto não era suficiente. Eu precisava excluir determinadas DLLs que estavam disponíveis somente após a compilation (módulos Ninject específicos do Azure que não são necessários quando eu implantar no IIS).

    Então eu tentei ligar gerando minha lista ExcludeFromPackageFiles usando o truque CopyAllFilesToSingleFolderForPackageDependsOn Sayed postado acima. No entanto, isso é tarde demais, pois o processo de empacotamento já removeu os itens ExcludeFromPackageFiles. Então, usei a mesma técnica, mas um pouco antes:

       $(ExcludeFilesFromPackageDependsOn); _ExcludeAzureDlls        _ExcludeAzureEnvironmentDlls    

    Espero que ajude alguém …