Ótima pergunta. Acabei de publicar uma entrada de blog muito detalhada sobre isso na Web Deployment Tool (MSDeploy): Build Package incluindo arquivos extras ou excluindo arquivos específicos .
Aqui está a sinopse. Depois de incluir os arquivos, mostro como excluir os arquivos também.
Incluindo arquivos extras
Incluir arquivos extras no pacote é um pouco mais difícil, mas ainda não é demais, se você se sentir confortável com o MSBuild e, se não estiver, leia isso. Para fazer isso, precisamos nos conectar à parte do processo que coleta os arquivos para empacotamento. O destino que precisamos estender é chamado CopyAllFilesToSingleFolder. Esse destino possui uma propriedade de dependência, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, na qual podemos acessar e injetar nosso próprio destino. Portanto, criaremos um destino chamado CustomCollectFiles e o injetaremos no processo. Conseguimos isso com o seguinte (lembre-se após a declaração de importação).
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
Isso adicionará nosso objetivo ao processo, agora precisamos definir o próprio objetivo. Vamos supor que você tenha uma pasta chamada Arquivos Extra que fica 1 nível acima do seu projeto da web. Você deseja incluir todos esses arquivos. Aqui está o destino CustomCollectFiles e discutiremos depois disso.
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
Aqui, o que eu fiz foi criar o item _CustomFiles e, no atributo Include, disse para ele pegar todos os arquivos nessa pasta e qualquer pasta abaixo dele. Se por acaso você precisar excluir algo dessa lista, adicione um Exclude
atributo a _CustomFiles
.
Então eu uso esse 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 de destino de metadados DestinationRelativePath. Isso determinará o caminho relativo que será colocado no pacote. Usei a instrução Extra Files% (RecursiveDir)% (Filename)% (Extension) aqui. O que está dizendo é colocá-lo no mesmo local relativo no pacote, na pasta Arquivos Extra.
Excluindo arquivos
Se você abrir o arquivo do projeto de um aplicativo Web criado com o VS 2010 na parte inferior, encontrará uma linha com.
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
BTW, você pode abrir o arquivo do projeto dentro do VS. Clique com o botão direito do mouse no projeto e escolha Unload Project. Em seguida, clique com o botão direito do mouse no projeto descarregado e selecione Editar Projeto.
Esta declaração incluirá todos os objetivos e tarefas que precisamos. A maioria de nossas personalizações deve ser posterior a essa importação, se você não tiver certeza se será depois! Portanto, se você tiver arquivos para excluir, existe um nome de item, ExcludeFromPackageFiles, que pode ser usado para fazer isso. Por exemplo, digamos que você tenha o arquivo Sample.Debug.xml, incluído no seu aplicativo da Web, mas deseje que esse arquivo seja excluído dos pacotes criados. Você pode colocar o snippet abaixo após a declaração de importação.
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
Ao declarar preencher esse item, os arquivos serão automaticamente excluídos. Observe o uso dos FromTarget
metadados aqui. Não vou abordar isso aqui, mas você deve saber sempre especificar isso.
Uma solução mais simples é editar o arquivo csproj para incluir a dll necessária na pasta bin e, em seguida, criar um destino beforebuild para copiar o item na pasta bin da pasta da biblioteca comum, onde armazenamos nossas DLLs de terceiros. Como o item existe no arquivo de solução, ele é implantado pelo msbuild / msdeploy e não é necessário nada complicado.
Tag usado para incluir o arquivo sem adicionar através do VS (que geralmente é necessário adicioná-lo ao seu VCS)
Este é o destino BeforeBuild que funcionou para mim:
Editado para incluir a sugestão de @ tuespetre de ocultar a entrada, removendo a desvantagem anterior de uma pasta bin visível. Não verificado por mim.
fonte
<Visible>false</Visible>
-lo para ocultá-lo no Solution Explorer.Assim como @toxaq, mas uma solução ainda mais simples é:
No gerenciador de soluções, adicione o arquivo como um link à pasta library / reference e, em seguida, nas propriedades, defina-o para ser copiado na saída da construção.
fonte
A implementação de Sayed não funcionou para mim. Estou usando o VS2013 e usando o pacote Web Deploy e precisava adicionar algumas DLLs de plug-in de outra pasta na lixeira do pacote de implantação. Veja como eu consegui fazê-lo funcionar (muito mais fácil):
Na parte inferior do seu arquivo csproj, adicione:
Outras referências no arquivo csproj:
fonte
Queria comentar para enfatizar o comentário de Emil Lerch acima. Se você instalou um SDK do Azure, procure um DependencyProperty diferente.
Basicamente, você pode precisar usar "CopyAllFilesToSingleFolderForMsdeployDependsOn em vez de" CopyAllFilesToSingleFolderForPackageDependsOn ". Eu não sou realmente um cara avançado do MsBuild e perdi horas puxando meu cabelo tentando determinar por que meus destinos não estavam sendo chamados.
Aqui está outro link, se isso não funcionar para você e você instalou um SDK do Azure: http://forums.iis.net/t/1190714.aspx
fonte
Como um adendo à resposta de Sayed, descobri que uma declaração estática dos itens ExcludeFromPackageFiles no meu projeto não era suficiente. Eu precisava excluir determinadas DLLs que só estavam disponíveis após compilação (módulos Ninject específicos do Azure que não são necessários quando eu implanto no IIS).
Então, tentei ligar a geração da minha lista ExcludeFromPackageFiles usando o truque CopyAllFilesToSingleFolderForPackageDependsOn Sayed postado acima. No entanto, é tarde demais, pois o processo de empacotamento já removeu os itens ExcludeFromPackageFiles. Então, eu usei a mesma técnica, mas um pouco antes:
Espero que ajude alguém ...
fonte
Além disso, é possível definir o arquivo como Conteúdo | Copie sempre
fonte