Ś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>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</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 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. Jeśli przypadkiem chcesz coś wykluczyć z tej listy, dodaj Exclude
atrybut do _CustomFiles
.
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.xml, 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 FromTarget
metadanych tutaj. Nie będę się tym tutaj zajmował, ale zawsze powinieneś to wiedzieć.
Prostszym rozwiązaniem jest edycja pliku csproj w celu uwzględnienia wymaganej biblioteki dll w folderze bin, a następnie utworzenie celu przed kompilacją, aby skopiować element do folderu bin ze wspólnego folderu biblioteki, w którym przechowujemy nasze pliki DLL innych firm. Ponieważ element istnieje w pliku rozwiązania, jest wdrażany przez msbuild / msdeploy i nie jest potrzebne nic skomplikowanego.
Znacznik używany do dołączania pliku bez dodawania przez VS (który zwykle będzie chciał dodać go do twojego VCS)
Oto cel BeforeBuild, który zadziałał dla mnie:
Edytowano, aby uwzględnić sugestię @ tuespetre, aby ukryć wpis, usuwając w ten sposób poprzednią wadę widocznego folderu bin. Niezweryfikowane przeze mnie.
źródło
<Visible>false</Visible>
ukrywanie go przed Eksploratorem rozwiązań.Podobnie jak @toxaq, ale jeszcze prostszym rozwiązaniem jest:
W eksploratorze rozwiązań dodaj plik jako łącze do folderu biblioteki / odnośniki, a następnie we właściwościach ustaw go tak, aby był kopiowany na wyjście kompilacji.
źródło
Więc implementacja Sayeda nie zadziałała dla mnie. Używam VS2013 i pakietu Web Deploy i potrzebuję dodać kilka bibliotek DLL wtyczek z innego folderu do kosza pakietu wdrażania. Oto, jak udało mi się to zrobić (znacznie łatwiej):
U dołu pliku csproj dodaj:
Inne elementy wymienione w pliku csproj:
źródło
Chciałem skomentować, aby podkreślić powyższy komentarz Emila Lercha. Jeśli masz zainstalowany zestaw Azure SDK, poszukaj innego DependencyProperty.
Zasadniczo może być konieczne użycie „CopyAllFilesToSingleFolderForMsdeployDependsOn zamiast„ CopyAllFilesToSingleFolderForPackageDependsOn ”. Nie jestem tak naprawdę zaawansowanym facetem z MsBuild i zmarnowałem godziny na wyrywanie sobie włosów, próbując ustalić, dlaczego moje cele nie są wywoływane.
Oto inny link, jeśli to nie działa, a masz zainstalowany zestaw Azure SDK: http://forums.iis.net/t/1190714.aspx
źródło
Jako dodatek do odpowiedzi Sayeda stwierdziłem, że statyczna deklaracja elementów ExcludeFromPackageFiles w moim projekcie nie wystarczyła. Musiałem wykluczyć niektóre biblioteki DLL, które były dostępne tylko po kompilacji (moduły Ninject specyficzne dla platformy Azure, które nie są potrzebne podczas wdrażania w usługach IIS).
Więc próbowałem podłączyć się do generowania mojej listy ExcludeFromPackageFiles za pomocą CopyAllFilesToSingleFolderForPackageDependsOn trick Sayed opublikowany powyżej. Jest to jednak za późno, ponieważ proces pakowania usunął już elementy ExcludeFromPackageFiles. Więc użyłem tej samej techniki, ale trochę wcześniej:
Mam nadzieję, że to komuś pomoże ...
źródło
Możliwe jest również ustawienie pliku jako Content | Kopiuj zawsze
źródło