Como obter a funcionalidade de 'Publicação' do Visual Studio para incluir arquivos do evento pós-compilação?

89

No momento, estou tentando usar a funcionalidade 'Publicar' e MSDeploy do Visual Studio 2010 para lidar com minhas necessidades de implantação da web, mas encontrei um obstáculo com relação à personalização do pacote, dependendo da minha configuração de compilação.

Eu desenvolvo em um ambiente de 32 bits, mas preciso criar um pacote de lançamento para um ambiente de 64 bits, portanto, na configuração 'Release', tenho um evento de pós-construção que copia a versão de 64 bits de uma dll de terceiros para o diretório bin substituindo a versão de 32 bits . Quando eu uso a funcionalidade 'Publicar', mesmo que a dll de 64 bits correta esteja sendo copiada para o diretório bin, ela não é incluída no pacote.

Existe uma maneira de 'Publicar' incluir arquivos que foram copiados para o diretório bin durante um evento pós-compilação?

brodie
fonte
1
Se você usar um evento pré- compilado em vez disso, isso parece funcionar como você gostaria (Visual Studio 2013, modelo de projeto ASP.NET).
bzlm
Eles parecem ter removido o comportamento predefinido mencionado no comentário acima no Visual Studio 2015 e posterior.
justdan23

Respostas:

91

Eu respondi a uma pergunta semelhante, mas diferente em Como você inclui arquivos adicionais usando os pacotes de implantação da web VS2010? .

Em seu cenário, você está usando o evento pós-compilação, eu recomendaria descartar o evento pós-compilação e implementar suas ações usando seus próprios destinos MSBuild em vez do evento pós-compilação. Abaixo você encontrará o texto da outra resposta.


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


Ótima pergunta. Acabei de postar uma entrada de blog muito detalhada sobre isso em Web Deployment Tool (MSDeploy): Build Package incluindo arquivos extras ou excluindo arquivos específicos .

Aqui está a sinopse. Depois de incluir os arquivos, mostrarei como excluí-los também.

Incluindo Arquivos Extra

Incluir arquivos extras no pacote é um pouco mais difícil, mas ainda não é nada demais se você estiver familiarizado com o MSBuild e, se não estiver, leia isto. Para fazer isso, precisamos nos conectar com a parte do processo que coleta os arquivos para empacotamento. O destino que precisamos estender é chamado CopyAllFilesToSingleFolder. Este destino tem uma propriedade de dependência, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, que podemos acessar e injetar nosso próprio destino. Portanto, vamos criar um destino chamado CustomCollectFiles e injetá-lo no processo. Conseguimos isso com o seguinte (lembre-se depois da instrução import).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Isso adicionará nosso alvo ao processo, agora precisamos definir o próprio alvo. Vamos supor que você tenha uma pasta chamada Arquivos extras 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 fiz foi criar o item _CustomFiles e no atributo Incluir disse a ele para pegar todos os arquivos daquela pasta e qualquer pasta abaixo dela. 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 dos metadados. Isso determinará o caminho relativo em que será colocado na embalagem. Eu usei a instrução Extra Files% (RecursiveDir)% (Filename)% (Extension) aqui. O que isso significa é colocá-lo no mesmo local relativo no pacote em 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, encontrará uma linha com.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

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

Essa declaração incluirá todas as metas e tarefas de que precisamos. A maioria de nossas personalizações devem ser posteriores a essa importação, se você não tiver certeza, coloque-as depois! Portanto, se você tiver arquivos para excluir, há um nome de item, ExcludeFromPackageFiles, que pode ser usado para isso. Por exemplo, digamos que você tenha um arquivo denominado Sample.Debug.js que está 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 a declaração de importação.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

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

Sayed Ibrahim Hashimi
fonte
1
Obrigado Sayed, embora não seja o método mais direto, acho que é assim que se faz.
brodie
8
@Disse, isso não parece funcionar para VS2012, você sabe como isso pode ser atualizado para este cenário. mudar para v11.0 não funciona. TIA.
Simon Francesco
2
@Daniel Se você precisa apenas de arquivos específicos e não de uma pasta, basta alterar _CustomFiles para incluir esses arquivos específicos em vez de adicionar recursivamente com ***. Portanto, algo como <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Algo semelhante a isso.
bwerks
3
@SimonFrancesco Eu também experimentei isso, e a mudança necessária parece ter sido estender <CopyAllFilesToSingleFolderForMsdeployDependsOn> em vez de <CopyAllFilesToSingleFolderForPackageDependsOn> como escrito na resposta acima.
bwerks
13

Eu encontrei uma solução alternativa para o problema usando o ExcludeFilesFromDeploymentelemento dentro do arquivo de projeto. Tive a ideia do Web Deployment: Excluindo arquivos e pastas

Portanto, se você precisar empacotar os arquivos do projeto conforme eles existem no diretório do projeto após uma construção bem-sucedida e as etapas de pós-construção associadas, faça o seguinte.

  1. Edite as configurações do projeto "Empacotar / Publicar Web" e
    selecione os Itens a serem implantados como "Todos os arquivos nesta pasta do projeto"
  2. Descarregue o projeto
  3. Clique com o botão direito no projeto descarregado e selecione para editar a configuração do projeto
  4. Localize o PropertyGroupelemento associado à definição de configuração, por exemplo, "Release"
  5. Dentro do PropertyGroupelemento, adicione os seguintes elementos e exclua arquivos e pastas que você não quer no pacote

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
  6. Salve e recarregue seu projeto

Isso resolve meu problema por enquanto, mas se houver uma solução melhor, por favor me avise, já que isso não é ideal devido ao hackery envolvido, mas talvez este seja um cenário de implantação incomum?

brodie
fonte
6

Selecione seus arquivos ou pastas e altere a ação Build como Conteúdo da janela Propriedades.

Gomes
fonte
1
Certo, mas adicionalmente você deve selecionar "Copiar se mais recente" ou "Copiar sempre", porque caso contrário, a ação padrão é "Não copiar", mesmo se "Conteúdo" estiver selecionado.
Matt de
1
concordar com o matt para etapa adicional
Gomes
7
Não existe ação Build para pastas (VS2013)
Cristian E.
copytooutputdirectory = Copiar Sempre
Gomes
Funcionou mesmo sem o Copy Always.
Tengiz de
3

Eu sei que é uma pergunta antiga, mas nada disso funcionou para mim.

Em 2017 VS eu apenas cliquei com o botão direito na pasta extra a ser publicada e selecione publicar que funcionou.

Exemplo:

insira a descrição da imagem aqui

user2695433
fonte
Embora seja um pequeno passo extra, é muito simples.
Ciaran Gallagher
0

Adicionar a pasta bin (e seu conteúdo) ao projeto fez com que os arquivos fossem copiados para o diretório de saída de publicação.

Para mim, meu problema era que eu precisava colocar um arquivo de licença de software proprietário no bin / pasta, mas não queria copiá-lo manualmente a cada implantação.

Isso estava usando o Visual Studio 2015 Professional

James Wierzba
fonte
0

Sei que esta é uma conversa antiga, mas me deparei com ela enquanto tentava fazer a mesma coisa e achei que seria útil acrescentar o que encontrei aqui.

Quase todos os artigos sobre a inclusão de arquivos extras em sua publicação usam este método de adicionar os itens CopyAllFilesToSingleFolderForPackageDependsOnou CopyAllFilesToSingleFolderForMSDeployDependsOnno PropertyGroupe todos eles dizem algo como "Eu adicionei isso ao final do arquivo ..."

Foi o que fiz e passei uma tarde tentando descobrir por que nada estava acontecendo, até que percebi que já havia uma PropertyGroupseção no topo do arquivo. Quando eu coloquei meu CopyAllFilesToSingleFolderForPackageDependsOnnessa seção funcionou bem.

Espero que isso economize o tempo de alguém algum dia

john.gleeson
fonte