79

Obecnie próbuję użyć funkcji "Publish" programu Visual Studio 2010 i MSDeploy do obsługi moich potrzeb związanych z wdrażaniem sieci Web, ale napotkałem na przeszkodę w związku z dostosowywaniem pakietu w zależności od mojej konfiguracji kompilacji.Jak uzyskać funkcjonalność "publikowania" programu Visual Studio w celu dołączania plików z zdarzenia budowania postu?

Rozwijam się w środowisku 32-bitowym, ale muszę utworzyć pakiet release dla środowiska 64-bitowego, więc w konfiguracji "Release" mam zdarzenie budowania postu, które kopiuje wersję 64-woltową dll innej firmy do katalogu bin nadpisywanie wersji 32-bitowej. Kiedy używam funkcji "Publikuj", mimo że poprawna biblioteka dll 64-bitowa jest kopiowana do katalogu bin, nie jest ona dołączana do pakietu.

Czy istnieje sposób, aby "Publikowanie" obejmowało pliki skopiowane do katalogu bin podczas zdarzenia budowania postu?

+1

Jeśli używasz * pre * -build wydarzenie zamiast, to wydaje się działać jak chcesz już podoba (Visual Studio 2013, ASP.NET szablon projektu). – bzlm

+0

Wygląda na to, że usunęły one wbudowane zachowanie wspomniane w powyższym komentarzu w programie Visual Studio 2015 i nowszych wersjach. – justdan23

Odpowiedz

74

Odpowiedziałem na podobne, ale inne pytanie na How do you include additional files using VS2010 web deployment packages?.

W scenariuszu, w którym używasz zdarzenia budowania postów, polecam upuszczenie zdarzenia budowania postu i zaimplementowanie działań przy użyciu własnych celów MSBuild zamiast zdarzenia po kompilacji. Poniżej znajdziesz tekst drugiej odpowiedzi.


Od: How do you include additional files using VS2010 web deployment packages?


wielkie pytanie. Właśnie opublikowałem bardzo szczegółowy wpis na blogu o tym pod adresem Web Deployment Tool (MSDeploy) : Build Package including extra files or excluding specific files.

Oto streszczenie. Po dołączeniu plików pokazuję, jak również wykluczyć pliki.

Łącznie dodatkowe pliki

Łącznie dodatkowe pliki do opakowania jest nieco trudniejsze, ale nadal nie bigee jeśli są wygodne z MSBuild, a jeśli nie są następnie przeczytać. W tym celu musimy podłączyć się do części procesu, który zbiera pliki do pakowania. Cel, który musimy rozszerzyć, nazywa się CopyAllFilesToSingleFolder. Ten cel ma właściwość zależności, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, którą możemy wykorzystać i wprowadzić własny cel. Stworzymy cel o nazwie CustomCollectFiles i wprowadzimy go do procesu. Osiągamy to następująco (pamiętaj po wydaniu polecenia importu).

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

To doda nasz cel do procesu, teraz musimy zdefiniować sam cel. Załóżmy, że masz folder o nazwie Dodatkowe pliki, który znajduje się na 1 poziomie nad twoim projektem internetowym. Chcesz uwzględnić wszystkie te pliki. Oto cel CustomCollectFiles i omówimy to później.

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

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

Oto co zrobiłem było stworzenie _CustomFiles punkt iw atrybutu zawierają powiedziano go odebrać wszystkie pliki w tym folderze i dowolny folder pod nią. Następnie używam tego elementu do zapełnienia elementu FilesForPackagingFromProject. Jest to element, który MSDeploy faktycznie używa do dodawania dodatkowych plików. Zauważ również, że zadeklarowałem wartość metadanych DestinationRelativePath. Określi to względną ścieżkę, którą zostanie umieszczony w pakiecie. Użyłem tutaj instrukcji Extra Files% (RecursiveDir)% (Filename)% (Extension). Oznacza to umieszczenie go w tej samej względnej lokalizacji w pakiecie, jak to jest w folderze Extra Files.

Wykluczanie plików

Jeśli otworzysz plik projektu z aplikacji internetowej stworzonej z VS 2010 w kierunku dna nim znajdziesz linię.

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

BTW można otworzyć plik projektu wewnątrz VS. Kliknij prawym przyciskiem myszy na projekt wybierz Rozładuj projekt. Następnie kliknij prawym przyciskiem myszy na rozładowanym projekcie i wybierz Edytuj projekt.

To oświadczenie będzie zawierać wszystkie cele i zadania, których potrzebujemy. Większość naszych dostosowań powinna nastąpić po tym imporcie, jeśli nie jesteś pewien, połóż to później! Więc jeśli masz pliki do wykluczenia, istnieje nazwa przedmiotu, ExcludeFromPackageFiles, które można wykorzystać do tego celu. Na przykład załóżmy, że masz plik o nazwie Sample.Debug.js, który jest zawarty w aplikacji internetowej, ale chcesz, aby ten plik został wykluczony z utworzonych pakietów. Możesz umieścić poniższy fragment po tym poleceniu importu.

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

Deklarując zapełnienie tego elementu, pliki zostaną automatycznie wykluczone. Zwróć uwagę na użycie metadanych FromTarget tutaj. Nie będę tu wchodził, ale powinieneś o tym wiedzieć.

+1

Dzięki Sayed, chociaż nie jest to najbardziej prosta metoda, jak sądzę, tak to się robi. – brodie

+0

@Sayed, co myślisz o tym rozwiązaniu, które wymyśliłem? http://stackoverflow.com/a/12202917/37055 –

+8

@Sayed, to nie wydaje się działać dla VS2012, czy wiesz, jak można to zaktualizować dla tego scenariusza. zmiana na v11.0 nie działa. TIA. –

12

Znalazłem obejście problemu za pomocą elementu ExcludeFilesFromDeployment w pliku projektu. Pomysł został podany przez Web Deployment: Excluding Files and Folders

Jeśli więc chcesz, aby pliki projektu były pakowane w katalogu projektu po udanej kompilacji i związanych z nią krokach kompilacji postów, wykonaj następujące czynności.

  1. Edytuj „pakiet/Publish Web” ustawienia projektu i
    wybrać pozycje wdrożyć być „Wszystkie pliki w tym folderze projektu”
  2. rozładować projektowi
  3. prawym przyciskiem myszy na projekcie nieobciążonym i wybrać edytuj konfigurację projektu
  4. Znajdź element PropertyGroup powiązany z ustawieniem konfiguracji, np. „Zwolnij”
  5. W elemencie PropertyGroup dodać w następujących elementów i uwzględniają wszystkie pliki i foldery, których nie chcesz w pakiecie

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment> 
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment> 
    
  6. Zapisz i załaduj projekt

ten na razie rozwiązuje mój problem, ale jeśli istnieje lepsze rozwiązanie, proszę dać mi znać, ponieważ nie jest to idealne ze względu na atak hakerów, ale może znowu jest to rzadki scenariusz wdrożenia?

4

Wybierz pliki lub foldery i zmień działanie kompilacji jako zawartość w oknie właściwości.

+1

Dobrze, ale dodatkowo musisz wybrać "Kopiuj, jeśli jest nowsza" lub "Kopiuj zawsze", ponieważ w przeciwnym razie domyślną akcją jest "Nie kopiuj", nawet jeśli wybrano "Treść". – Matt

+1

Zgadzam się z matowym dodatkowym krokiem – Gomes

+7

Brak działania kompilacji dla folderów (VS2013) –

0

Dodanie folderu bin (i jego zawartości) do projektu spowodowało skopiowanie plików do katalogu wyjściowego publikowania.

Dla mnie, moim problemem było to, że musiałem umieścić zastrzeżony plik licencji oprogramowania w koszu/folderze, ale nie chciałem kopiować go ręcznie dla każdego wdrożenia.

Było za pomocą Visual Studio 2015 Profesjonalne

Powiązane problemy