Jak uzyskać funkcję „Publikuj” programu Visual Studio, aby uwzględnić pliki ze zdarzenia po kompilacji?

90

Obecnie próbuję użyć funkcji „Publikuj” programu Visual Studio 2010 i MSDeploy do obsługi moich potrzeb związanych z wdrażaniem w sieci Web, ale napotkałem przeszkodę dotyczącą dostosowywania pakietu w zależności od konfiguracji mojej kompilacji.

Tworzę w środowisku 32-bitowym, ale muszę utworzyć pakiet wydania dla środowiska 64-bitowego, więc w konfiguracji „Release” mam zdarzenie po kompilacji, które kopiuje 64-bitową wersję pliku DLL innej firmy do katalogu bin, nadpisując wersję 32-bitową . Kiedy używam funkcji „Publikuj”, mimo że poprawna 64-bitowa biblioteka dll jest kopiowana do katalogu bin, nie jest dołączana do pakietu.

Czy istnieje sposób, aby polecenie „Publikuj” obejmowało pliki, które zostały skopiowane do katalogu bin podczas zdarzenia po kompilacji?

brodie
źródło
1
Jeśli zamiast tego używasz zdarzenia przed kompilacją, wydaje się, że działa to tak, jak chcesz (Visual Studio 2013, szablon projektu ASP.NET).
bzlm
Wydaje się, że usunęli wstępnie zbudowane zachowanie wspomniane w powyższym komentarzu w programie Visual Studio 2015 i nowszych.
justdan

Odpowiedzi:

92

Odpowiedziałem na podobne, ale inne pytanie: Jak dołączyć dodatkowe pliki za pomocą pakietów wdrożeniowych VS2010? .

W swoim scenariuszu korzystasz ze zdarzenia po kompilacji, zalecam porzucenie zdarzenia po kompilacji i zaimplementowanie akcji przy użyciu własnych celów programu MSBuild zamiast zdarzenia po kompilacji. Poniżej znajdziesz tekst drugiej odpowiedzi.


Od: Jak dołączyć dodatkowe pliki za pomocą pakietów wdrożeniowych sieci Web VS2010?


Świetne pytanie. Właśnie opublikowałem bardzo szczegółowy wpis na blogu na ten temat w Web Deployment Tool (MSDeploy): Build Package zawierający dodatkowe pliki lub wykluczający określone pliki .

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

W tym dodatkowe pliki

Włączanie dodatkowych plików do pakietu jest nieco trudniejsze, ale nadal nie jest to ważne, jeśli czujesz się komfortowo z programem MSBuild, a jeśli nie, przeczytaj to. Aby to zrobić, musimy podłączyć się do części procesu, która 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 wstrzyknąć własny cel. Dlatego utworzymy cel o nazwie CustomCollectFiles i wstrzykniemy go do procesu. Osiągamy to w następujący sposób (pamiętaj po instrukcji import).

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

To doda nasz cel do procesu, teraz musimy zdefiniować sam cel. Załóżmy, że masz folder o nazwie Extra Files, który znajduje się 1 poziom nad projektem sieci Web. Chcesz dołączyć wszystkie te pliki. Oto cel CustomCollectFiles i omówimy go później.

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

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

Tutaj utworzyłem element _CustomFiles iw atrybucie Include powiedziałem mu, aby podniósł wszystkie pliki w tym folderze i każdy folder znajdujący się pod nim. Następnie używam tego elementu do wypełnienia elementu FilesForPackagingFromProject. Jest to element, którego program MSDeploy faktycznie używa do dodawania dodatkowych plików. Zwróć również uwagę, że zadeklarowałem wartość DestinationRelativePath metadanych. To określi względną ścieżkę, którą zostanie umieszczony w pakiecie. Użyłem tutaj instrukcji Extra Files% (RecursiveDir)% (Filename)% (Extension). Chodzi o to, aby umieścić go w tej samej względnej lokalizacji w pakiecie, co w folderze Extra Files.

Z wyłączeniem plików

Jeśli otworzysz plik projektu aplikacji internetowej utworzonej za pomocą VS 2010, na dole znajdziesz wiersz z.

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

BTW, możesz otworzyć plik projektu wewnątrz VS. Kliknij prawym przyciskiem myszy projekt, wybierz Zwolnij projekt. Następnie kliknij prawym przyciskiem myszy rozładowany projekt i wybierz Edytuj projekt.

To oświadczenie będzie zawierało wszystkie cele i zadania, których potrzebujemy. Większość naszych dostosowań powinna nastąpić po tym imporcie, jeśli nie jesteś pewien, czy po tym! Więc jeśli masz pliki do wykluczenia, istnieje nazwa elementu ExcludeFromPackageFiles, której można użyć do tego. Na przykład, powiedzmy, że masz plik o nazwie Sample.Debug.js, który jest zawarty w twojej aplikacji internetowej, ale chcesz, aby ten plik został wykluczony z tworzonych pakietów. Możesz umieścić poniższy fragment po tej instrukcji importu.

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

Deklarując wypełnienie tego elementu, pliki zostaną automatycznie wykluczone. Zwróć uwagę na użycie metadanych FromTarget tutaj. Nie będę się tym tutaj zajmował, ale powinieneś wiedzieć, aby zawsze to określać.

Sayed Ibrahim Hashimi
źródło
8
@ Powiedziano, że to nie działa dla VS2012, czy wiesz, jak można to zaktualizować w tym scenariuszu. zmiana na wersję 11.0 nie działa. TIA.
Simon Francesco,
2
Nie ma dosłownie żadnej dokumentacji na temat tych rzeczy. Dokumentacja firmy Microsoft zawiera odniesienia do Twoich blogów.
Matthew James Davis,
2
@Daniel Jeśli potrzebujesz tylko określonych plików, a nie folderu, po prostu zmień _CustomFiles, aby uwzględnić te określone pliki, zamiast dodawać rekursywnie za pomocą ***. Coś w rodzaju <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Coś podobnego.
bwerks
3
@SimonFrancesco Ja również tego doświadczyłem i wydaje się, że niezbędną zmianą było rozszerzenie <CopyAllFilesToSingleFolderForMsdeployDependsOn> zamiast <CopyAllFilesToSingleFolderForPackageDependsOn>, jak napisano w powyższej odpowiedzi.
bwerks
13

Znalazłem obejście tego problemu, używając ExcludeFilesFromDeploymentelementu w pliku projektu. Wpadłem na pomysł Web Deployment: Exclusion Files and Folders

Jeśli więc musisz spakować pliki projektu w postaci, w jakiej istnieją w katalogu projektu po pomyślnej kompilacji i powiązanych krokach po kompilacji, wykonaj następujące czynności.

  1. Edytuj ustawienia projektu „Pakuj / publikuj w sieci” i
    wybierz opcję Elementy do wdrożenia jako „Wszystkie pliki w tym folderze projektu”
  2. Rozładuj projekt
  3. Kliknij prawym przyciskiem myszy wyładowany projekt i wybierz, aby edytować konfigurację projektu
  4. Znajdź plik PropertyGroup element powiązany z ustawieniem konfiguracji, np. „Zwolnij”
  5. W ramach PropertyGroupelementu dodaj następujące elementy i wyklucz 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 ponownie swój projekt

To rozwiązuje mój problem na razie, ale jeśli istnieje lepsze rozwiązanie, daj mi znać, ponieważ nie jest to idealne ze względu na włamanie, ale z drugiej strony może jest to rzadki scenariusz wdrożenia?

brodie
źródło
6

Wybierz pliki lub foldery i zmień akcję kompilacji jako zawartość w oknie Właściwości.

Gomes
źródło
1
Zgadza się, ale dodatkowo musisz wybrać „Kopiuj, jeśli nowszy” lub „Kopiuj zawsze”, ponieważ w innym przypadku domyślną akcją jest „Nie kopiuj”, nawet jeśli wybrana jest opcja „Treść”.
Matt
1
zgadzam się z matem na dodatkowy krok
Gomes
7
Nie istnieje akcja kompilacji dla folderów (VS2013)
Cristian E.
copytooutputdirectory = Kopiuj zawsze
Gomes
Działał nawet bez opcji Zawsze kopiuj.
Tengiz
3

Wiem, że to stare pytanie, ale żadne z nich nie zadziałało.

W 2017 VS po prostu kliknąłem prawym przyciskiem myszy dodatkowy folder do opublikowania i wybrałem publikację, która zadziałała.

Przykład:

wprowadź opis obrazu tutaj

user2695433
źródło
Chociaż jest to mały dodatkowy krok, jest bardzo prosty.
Ciaran Gallagher
0

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

Moim problemem było to, że musiałem umieścić plik licencji oprogramowania własnościowego w folderze bin /, ale nie chciałem kopiować go ręcznie przy każdym wdrożeniu.

To było przy użyciu programu Visual Studio 2015 Professional

James Wierzba
źródło
0

Wiem, że to stara rozmowa, ale natknąłem się na nią, próbując zrobić to samo i pomyślałem, że pomocne będzie dodanie tego, co tutaj znalazłem.

Prawie wszystkie artykuły o dołączaniu dodatkowych plików do publikacji używają tej metody dodawania elementów CopyAllFilesToSingleFolderForPackageDependsOnlub CopyAllFilesToSingleFolderForMSDeployDependsOnw PropertyGroupi wszystkie są takie same, jak „Dodałem to na końcu pliku ...”

To właśnie zrobiłem i spędziłem popołudnie próbując dowiedzieć się, dlaczego nic się nie dzieje, dopóki nie zdałem sobie sprawy, że PropertyGroupna początku pliku jest już sekcja. Kiedy umieściłem mójCopyAllFilesToSingleFolderForPackageDependsOn w tej sekcji, działało dobrze.

Mam nadzieję, że pewnego dnia zaoszczędzi to komuś czasu

john.gleeson
źródło