Domanda

sto testando utilizzando la nuova funzionalità di confezionamento web in Visual Studio 2010 e sono imbattuto in una situazione in cui io uso un evento di pre-compilazione per copiare del dll richiesti nella mia cartella bin che la mia applicazione si basa su per le chiamate API. Essi non possono essere inclusi come riferimento dal momento che non sono DLL COM che possono essere utilizzati con interoperabilità.

Quando costruisco il mio pacchetto di distribuzione quei file sono esclusi quando scelgo l'opzione per includere solo i file necessari per eseguire l'applicazione. C'è un modo per configurare le impostazioni di distribuzione per includere questi file? Ho avuto fortuna a trovare nulla di buono documentazione su questo.

È stato utile?

Soluzione

Grande questione. Ho appena pubblicato un blog molto dettagliato su questo a Web Deployment Tool (MSDeploy): Corporatura Pacchetto compreso file aggiuntivi o file specifici esclusi .

Ecco la sinossi. Dopo inclusi i file, mostro come escludere i file pure.

inclusione di file Extra

Inclusione di file in più nel pacchetto è un po 'più difficile ma ancora nessuna bigee se hai dimestichezza con MSBuild, e se non siete allora leggere questo. Per fare questo abbiamo bisogno di agganciare nella parte del processo che raccoglie i file per il confezionamento. L'obiettivo abbiamo bisogno di estendere viene chiamato CopyAllFilesToSingleFolder. Questo obiettivo ha una proprietà di dipendenza, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, che possiamo attingere e iniettare il nostro obiettivo. Così creeremo un target CustomCollectFiles di nome e iniettare che nel processo. Raggiungiamo questo obiettivo con la seguente (ricordate dopo l'istruzione import).

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

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

Questo aggiungerà il nostro obiettivo per il processo, ora abbiamo bisogno di definire la stessa destinazione. Supponiamo che si dispone di una cartella di file aggiuntivi di nome che si trova 1 livello sopra il vostro progetto web. Si vuole includere tutti quei file. Ecco l'CustomCollectFiles target e discutiamo dopo.

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

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

Ecco quello che ho fatto è stato creare le _CustomFiles voce e l'attributo Include detto che per raccogliere tutti i file in quella cartella e qualsiasi cartella sotto di esso. Se per caso avete bisogno di esclude qualcosa da tale elenco, aggiungere un attributo Exclude a _CustomFiles.

Poi ho utilizzare questo oggetto per popolare l'elemento FilesForPackagingFromProject. Questo è l'elemento che MSDeploy in realtà usa per aggiungere altri file. Si noti inoltre che ho dichiarato il valore DestinationRelativePath metadati. Ciò determinerà il percorso relativo che verrà inserito nel pacchetto. Ho usato la dichiarazione Extra Files% (RecursiveDir)% (Nome del file)% (Extension) qui. Cosa che sta dicendo è quello di collocarlo nella stessa posizione relativa nella confezione in quanto è nella cartella Extra Files.

File esclusa

Se si apre il file di progetto di un'applicazione web creata con VS 2010 al fondo di esso troverete una linea con.

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

A proposito è possibile aprire il file di progetto all'interno di VS. Fare clic destro sul progetto scegliere Scarica progetto. Quindi fare clic destro sul progetto scaricato e selezionare Modifica del progetto.

Questa dichiarazione comprende tutti gli obiettivi e le attività di cui abbiamo bisogno. La maggior parte delle nostre personalizzazioni dovrebbe essere, dopo che l'importazione, se non si è sicuri di mettere se dopo! Quindi, se si dispone di file da escludere c'è un nome dell'elemento, ExcludeFromPackageFiles, che possono essere utilizzati per farlo. Per esempio diciamo che avete Sample.Debug.js file di nome che comprendeva nella propria applicazione web, ma si desidera che il file da escludere dai pacchetti creati. È possibile inserire il frammento di codice di seguito, dopo che la dichiarazione di importazione.

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

Dichiarando che popolano questa voce verranno automaticamente esclusi i file. Si noti l'uso dei metadati FromTarget qui. Non voglio entrare in questa sede, ma si deve sapere per specificare sempre che.

Altri suggerimenti

Una soluzione più semplice è quella di modificare il file csproj per includere la dll richiesto nella cartella bin e quindi creare un target BeforeBuild per copiare l'elemento nella cartella bin dalla cartella libreria comune in cui conserviamo il nostro 3 ° DLL partito. Poiché l'oggetto esiste nel file di soluzione è implementata da msbuild / msdeploy e nulla di complicato è necessario.

Tag utilizzato per includere file senza l'aggiunta attraverso VS (che si desidera aggiungere ai tuoi VCS di solito)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

Questo è l'obiettivo BeforeBuild che ha funzionato per me:

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

A cura di includere @ suggerimento di tuespetre per nascondere la voce eliminando in tal modo l'aspetto negativo precedente di una cartella bin visibile. Non verificati da me.

Proprio come @toxaq, ma una soluzione ancora più semplice è quella di:

In Esplora soluzioni aggiungere il file come un link alla libreria / cartella riferimenti, e quindi nelle proprietà impostate per essere copiato uscita del costruire.

L'implementazione Quindi Sayed non ha funzionato per me. Sto usando VS2013 e utilizzando il pacchetto di distribuzione Web e aveva bisogno di aggiungere alcune DLL dei plugin da un'altra cartella nel bidone del pacchetto di deploy. Ecco come sono riuscito a farlo funzionare (molto più facile):

Nella parte inferiore del file csproj aggiungere:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <ItemGroup> 
        <Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />  
</Target>

Altri mentionables nel file csproj:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
    <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
    <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
    <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
    <PublishDatabases>false</PublishDatabases>
</PropertyGroup>

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

voluto commentare per sottolineare il commento di Emil Lerch sopra. Se è stato installato un Azure SDK, quindi cercare un DependencyProperty diverso.

In sostanza, potrebbe essere necessario usare "CopyAllFilesToSingleFolderForMsdeployDependsOn invece di 'CopyAllFilesToSingleFolderForPackageDependsOn'. Io non sono davvero un ragazzo MsBuild avanzato e I ore sprecate tirando fuori i miei capelli cercando di determinare perché i miei obiettivi non sono stati sempre chiamati.

Ecco un altro link se questo non funziona per voi ed è stata installata un'Azure SDK: http://forums.iis.net/t/1190714.aspx

Come un addendum alla risposta di Sayed, ho trovato che una dichiarazione statica di articoli ExcludeFromPackageFiles all'interno del mio progetto non è stato sufficiente. Avevo bisogno di escludere alcune DLL che erano disponibili solo dopo di compilazione (Azure specifici moduli Ninject che non sono necessari quando schiero a IIS).

Così ho cercato di agganciare nella generazione di mia lista ExcludeFromPackageFiles utilizzando il trucco CopyAllFilesToSingleFolderForPackageDependsOn Sayed postato sopra. Tuttavia, questo è troppo tardi, come il processo di confezionamento ha già rimosso le voci ExcludeFromPackageFiles. Così, ho usato la stessa tecnica, ma un po 'prima:

<PropertyGroup>
    <ExcludeFilesFromPackageDependsOn>
        $(ExcludeFilesFromPackageDependsOn);
        _ExcludeAzureDlls
    </ExcludeFilesFromPackageDependsOn>
</PropertyGroup>

<Target Name="_ExcludeAzureDlls">
    <ItemGroup>
        <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
                               Exclude="%(RootDir)%(Directory)*Azure*.dll" />
        <AzureFiles Include="@(FilesForPackagingFromProject)"
                    Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
        <ExcludeFromPackageFiles Include="@(AzureFiles)">
            <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
        </ExcludeFromPackageFiles>
    </ItemGroup>
</Target>

La speranza che aiuta qualcuno ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top