Come ottenere la funzionalità "Pubblica" di Visual Studio per includere file dall'evento di post compilazione?


90

Attualmente sto tentando di utilizzare le funzionalità "Pubblica" e MSDeploy di Visual Studio 2010 per gestire le mie esigenze di distribuzione web, ma ho incontrato un ostacolo per quanto riguarda la personalizzazione del pacchetto a seconda della configurazione della mia build.

Sviluppo in un ambiente a 32 bit ma ho bisogno di creare un pacchetto di rilascio per un ambiente a 64 bit, quindi nella configurazione 'Release' ho un evento di post build che copia la versione a 64 bit di una dll di terze parti nella directory bin sovrascrivendo la versione a 32 bit . Quando utilizzo la funzionalità "Pubblica", anche se la dll a 64 bit corretta viene copiata nella directory bin, non viene inclusa nel pacchetto.

C'è un modo per far sì che "Pubblica" includa i file che sono stati copiati nella directory bin durante un evento di post-compilazione?


1
Se invece utilizzi un evento pre- build, sembra che funzioni già come desideri (Visual Studio 2013, modello di progetto ASP.NET).
bzlm

Sembra che abbiano rimosso il comportamento predefinito menzionato nel commento sopra in Visual Studio 2015 e versioni successive.
justdan23

Risposte:


92

Ho risposto a una domanda simile ma diversa in Come includere file aggiuntivi utilizzando i pacchetti di distribuzione web VS2010? .

Nel tuo scenario in cui stai utilizzando l'evento post build, ti consiglio di eliminare l'evento post build e implementare le tue azioni utilizzando i tuoi obiettivi MSBuild invece dell'evento post build. Di seguito troverai il testo dell'altra risposta.


Da: come si includono file aggiuntivi utilizzando i pacchetti di distribuzione web VS2010?


Ottima domanda. Ho appena pubblicato un post sul blog molto dettagliato su questo argomento Web Deployment Tool (MSDeploy): Build Package che include file extra o esclude file specifici .

Ecco la sinossi. Dopo aver incluso i file, mostro come escludere anche i file.

Compresi file extra

Includere file extra nel pacchetto è un po 'più difficile ma comunque non è un problema se sei a tuo agio con MSBuild, e se non lo sei allora leggi questo. Per fare questo dobbiamo agganciarci alla parte del processo che raccoglie i file per il packaging. L'obiettivo che dobbiamo estendere si chiama CopyAllFilesToSingleFolder. Questa destinazione ha una proprietà di dipendenza, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, che possiamo attingere e iniettare la nostra destinazione. Quindi creeremo un target denominato CustomCollectFiles e lo inseriremo nel processo. Otteniamo ciò con quanto segue (ricorda dopo l'istruzione import).

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

Questo aggiungerà il nostro obiettivo al processo, ora dobbiamo definire l'obiettivo stesso. Supponiamo che tu abbia una cartella denominata File extra che si trova 1 livello sopra il tuo progetto web. Vuoi includere tutti quei file. Ecco l'obiettivo CustomCollectFiles e dopo ne discuteremo.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Qui quello che ho fatto è stato creare l'elemento _CustomFiles e nell'attributo Include gli ho detto di raccogliere tutti i file in quella cartella e qualsiasi cartella sottostante. Quindi utilizzo questo elemento per popolare l'elemento FilesForPackagingFromProject. Questo è l'elemento che MSDeploy utilizza effettivamente per aggiungere file aggiuntivi. Si noti inoltre che ho dichiarato il valore DestinationRelativePath dei metadati. Questo determinerà il percorso relativo che verrà inserito nel pacchetto. Ho usato l'istruzione Extra Files% (RecursiveDir)% (Filename)% (Extension) qui. Ciò che sta dicendo è posizionarlo nella stessa posizione relativa nel pacchetto in cui si trova nella cartella File extra.

Esclusi i file

Se apri il file di progetto di un'applicazione web creata con VS 2010 verso la parte inferiore di esso troverai una linea con.

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

BTW è possibile aprire il file di progetto all'interno di VS. Fare clic con il pulsante destro del mouse sul progetto, selezionare Scarica progetto. Quindi fare clic con il pulsante destro del mouse sul progetto scaricato e selezionare Modifica progetto.

Questa dichiarazione includerà tutti gli obiettivi e le attività di cui abbiamo bisogno. La maggior parte delle nostre personalizzazioni dovrebbero essere successive a tale importazione, se non sei sicuro di metterle se dopo! Quindi, se hai file da escludere, c'è un nome di elemento, ExcludeFromPackageFiles, che può essere utilizzato per farlo. Ad esempio, supponiamo che tu abbia un file denominato Sample.Debug.js incluso nella tua applicazione web ma desideri che quel file venga escluso dai pacchetti creati. Puoi inserire lo snippet di seguito dopo quella dichiarazione di importazione.

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

Dichiarando di popolare questo elemento i file verranno automaticamente esclusi. Notare l'utilizzo dei metadati FromTarget qui. Non ne parlerò qui, ma dovresti sapere di specificarlo sempre.


8
@Detto, questo non sembra funzionare per VS2012, sai come può essere aggiornato per questo scenario. il passaggio alla v11.0 non funziona. TIA.
Simon Francesco

2
Non c'è letteralmente alcuna documentazione su questa roba. La documentazione Microsoft fa riferimento ai tuoi blog.
Matthew James Davis,

2
@Daniel Se hai solo bisogno di file specifici e non di una cartella, cambia semplicemente _CustomFiles per includere quei file specifici invece di aggiungerli ricorsivamente con ***. Quindi qualcosa come <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Qualcosa di simile a quello.
bwerks

3
@SimonFrancesco Anche io ho sperimentato questo, e il cambiamento necessario sembra essere stato quello di estendere <CopyAllFilesToSingleFolderForMsdeployDependsOn> piuttosto che <CopyAllFilesToSingleFolderForPackageDependsOn> come scritto nella risposta sopra.
bwerks


13

Ho trovato una soluzione al problema utilizzando l' ExcludeFilesFromDeploymentelemento all'interno del file di progetto. Ho avuto l'idea da Web Deployment: Excluding Files and Folders

Quindi, se è necessario creare un pacchetto di file di progetto così come esistono nella directory del progetto dopo una compilazione riuscita e i passaggi di post-compilazione associati, eseguire le operazioni seguenti.

  1. Modifica le impostazioni del progetto "Pacchetto / Pubblica Web" e
    seleziona gli elementi da distribuire in "Tutti i file in questa cartella del progetto"
  2. Scarica il progetto
  3. Fare clic con il tasto destro sul progetto scaricato e selezionare per modificare la configurazione del progetto
  4. Individua l' PropertyGroupelemento associato all'impostazione di configurazione, ad esempio "Rilascia"
  5. All'interno PropertyGroupdell'elemento aggiungi i seguenti elementi ed escludi file e cartelle che non vuoi nel pacchetto

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. Salva e ricarica il tuo progetto

Questo risolve il mio problema per il momento, ma se esiste una soluzione migliore, fammelo sapere, poiché non è l'ideale a causa dell'hackeraggio coinvolto, ma forse questo è uno scenario di distribuzione insolito?


6

Selezionare i file o le cartelle e modificare l'azione di creazione come contenuto dalla finestra delle proprietà.


1
Giusto, ma in aggiunta devi selezionare "Copia se più recente" o "Copia sempre", perché altrimenti l'azione predefinita è "Non copiare", anche se "Contenuto" è selezionato.
Matt

1
d'accordo con matt per il passaggio aggiuntivo
Gomes

7
Non esiste alcuna azione di compilazione per le cartelle (VS2013)
Cristian E.

copytooutputdirectory = Copia sempre
Gomes

Ha funzionato anche senza Copia sempre.
Tengiz

3

So che è una vecchia domanda, ma nessuna di queste ha funzionato per me.

Nel 2017 VS ho fatto clic con il pulsante destro del mouse sulla cartella aggiuntiva da pubblicare e selezionare pubblica ha funzionato.

Esempio:

inserisci qui la descrizione dell'immagine


Sebbene sia un piccolo passaggio in più, è molto semplice.
Ciaran Gallagher

0

Aggiungere la cartella bin (e il suo contenuto) al progetto causato la copia dei file nella directory di output di pubblicazione.

Per me, il mio problema era che dovevo posizionare un file di licenza del software proprietario nella cartella bin /, ma non volevo copiarlo manualmente a ogni distribuzione.

Questo utilizzava Visual Studio 2015 Professional


0

So che questa è una vecchia conversazione, ma mi sono imbattuto mentre cercavo di fare la stessa cosa e ho pensato che sarebbe stato utile aggiungere quello che ho trovato qui.

Quasi tutti gli articoli sull'inclusione di file extra nella tua pubblicazione usano questo metodo per aggiungere gli elementi CopyAllFilesToSingleFolderForPackageDependsOno CopyAllFilesToSingleFolderForMSDeployDependsOnnel PropertyGroupe tutti uguali qualcosa come "L'ho aggiunto alla fine del file ..."

Questo è quello che ho fatto e ho passato un pomeriggio a cercare di scoprire perché non stava succedendo nulla fino a quando mi sono reso conto che c'era già una PropertyGroupsezione all'inizio del file. Quando metto il mio fileCopyAllFilesToSingleFolderForPackageDependsOn in quella sezione ha funzionato bene.

Spero che questo faccia risparmiare tempo a qualcuno un giorno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.