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?
Odpowiedzi:
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ć.
źródło
Znalazłem obejście tego problemu, używając
ExcludeFilesFromDeployment
elementu w pliku projektu. Wpadłem na pomysł Web Deployment: Exclusion Files and FoldersJeś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.
wybierz opcję Elementy do wdrożenia jako „Wszystkie pliki w tym folderze projektu”
PropertyGroup
element powiązany z ustawieniem konfiguracji, np. „Zwolnij”W ramach
PropertyGroup
elementu 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>
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?
źródło
Wybierz pliki lub foldery i zmień akcję kompilacji jako zawartość w oknie Właściwości.
źródło
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:
źródło
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
źródło
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
CopyAllFilesToSingleFolderForPackageDependsOn
lubCopyAllFilesToSingleFolderForMSDeployDependsOn
wPropertyGroup
i 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
PropertyGroup
na 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
źródło