Użycie msbuild do uruchomienia profilu Publish systemu plików

Mam projekt c#. Net 4.0 stworzony z VS2010 i teraz jest dostępny z VS2012.

Próbuję opublikować tylko potrzebne pliki z tej strony do miejsca docelowego (C:\builds\MyProject [pliki])

Moja struktura plików: ./ ProjectRoot / MyProject.csproj ./ ProjectRoot / Properties/PublishProfiles / FileSystemDebug.pubxml

Uruchamiam następujące przez MSBuild:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ ProjectRoot / MyProject.csproj / p:DeployOnBuild=true /P:Publisprofile=./ ProjectRoot / Properties/PublishProfiles / FileSystemDebug.pubxml

Oto XML w FileSystemDebug.pubxml

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\builds\MyProject\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

Wynikiem zachowania jest:

  • tworzony jest plik zip: ./ ProjectRoot / obj/Debug/Package / MyProject.zip
  • nic nie jest rozmieszczone do <publishUrl>C:\builds\MyProject\</publishUrl> WTF
  • tworzony plik zip jest pełen plików, które nie są potrzebne do aplikacji.

Po uruchomieniu tego profilu publish przez visual studio tworzony jest folder w * C:\builds\MyProject * i zawiera dokładne artefakty, które chcę.

Jak uzyskać ten prosty wynik z msbuild?

Author: P. Roe, 2013-04-27

5 answers

FYI: miałem ten sam problem z Visual Studio 2015. Po wielu godzinach prób, mogę teraz zrobić msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile.

Musiałem edytować swoje .plik csproj, aby go uruchomić. Zawierała taki wiersz:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

Zmieniłem ten wiersz w następujący sposób:

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

(zmieniłem 10.0 na 14.0, Nie wiem czy to konieczne. Ale zdecydowanie musiałem usunąć część stanu.)

 36
Author: johanv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 17:44:54

Tutaj znalazłem odpowiedź: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

Visual Studio 2010 ma wielki nowy projekt aplikacji webowej publishing funkcje, które pozwalają na łatwe publikowanie projektu aplikacji internetowej z kliknięcie przycisku. Za kulisami sieć.Config transformation i budowanie pakietów odbywa się za pomocą ogromnego skryptu MSBuild, który jest importowany do pliku projektu (znalezionego na stronie: C:\Program Pliki (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Www.Wydawnictwo.cele). Niestety scenariusz jest ogromnie skomplikowany, niechlujny i nieudokumentowane (inne niż niektóre często źle napisane i w większości bezużyteczne komentarze w pliku). Duży flowchart tego pliku i kilka dokumentacja o tym, jak się do niej podłączyć, byłaby fajna, ale wydaje się, że niestety brakuje (a przynajmniej nie mogę go znaleźć).

Niestety, oznacza to wykonywanie publikacji za pomocą wiersza poleceń jest dużo bardziej nieprzezroczyste niż musi być. Zaskoczył mnie brak dokumentacji w tym zakresie, ponieważ w dzisiejszych czasach wiele sklepów korzysta z serwer ciągłej integracji, a niektóre nawet zautomatyzowane wdrażanie (w czym funkcje publikowania VS2010 mogą bardzo pomóc), więc I pomyślałbym, że umożliwienie tego (łatwo!) byłby dość głównym wymogiem dla funkcji.

W każdym razie, po przekopaniu się przez Microsoft.Www.Wydawnictwo.cele file for hours and fucking my Głowa o ścianę prób i błędów, Udało mi się dowiedzieć, jak Visual Studio wydaje się wykonywać swoje magic one click "Publish to File System" I " Build Deployment Pakiet " funkcje. Będę miał trochę skryptów MSBuild, więc jeśli nie jesteś zaznajomiony z MSBuild proponuję sprawdzić ten crash strona kursu MSDN.

Publikuj w systemie plików

Okno dialogowe Publikuj w systemie plików VS2010 Publikuj w systemie plików mnie jakiś czas do szaleństwa, bo ja spodziewam się sensownego wykorzystania MSBuild do zaistnienia. Zamiast tego VS2010 robi coś dość dziwnego: wywołuje na MSBuild, aby wykonać rodzaj pół-wdrożenia, który przygotowuje sieć plików aplikacji w folderze obj projektu, a następnie wydaje się, że robi podręcznik Kopia tych plików (tj. poza MSBuild) do swojej docelowej publikacji folder. To jest naprawdę dziwne zachowanie, ponieważ MSBuild jest przeznaczony do Kopiuj pliki (i inne rzeczy związane z kompilacją), aby miało to sens jeśli cały proces był tylko jeden cel MSBuild, który VS2010 nazwał na, nie cel, a Kopia ręczna.

Oznacza to, że robienie tego przez MSBuild w wierszu poleceń nie jest tak proste jak wywołanie pliku projektu z określonym celem i ustawianie niektórych właściwości. Będziesz musiał zrobić to, co powinien mieć VS2010 gotowe: stwórz sam cel, który wykona pół-wdrożenie, a następnie kopiuje wyniki do folderu docelowego. Aby edytować plik projektu, kliknij prawym przyciskiem myszy projekt w VS2010 i kliknij rozwiń Project, then kliknij prawym przyciskiem myszy ponownie i kliknij Edytuj. Przewiń w dół, aż znajdziesz Element importu, który importuje cele aplikacji webowej (Microsoft.Webaplikacja.cele; ten plik sam importuje Microsoft.Www.Wydawnictwo.plik targets wspomniany wcześniej). Pod spodem w tej linii dodamy nasz nowy cel, o nazwie PublishToFileSystem:

<Target Name="PublishToFileSystem"
        DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''"
           Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))"
             Directories="$(PublishDestination)" />

    <ItemGroup>
        <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(PublishFiles)"
          DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
          SkipUnchangedFiles="True" />
</Target>

Ten cel zależy od PipelinePreDeployCopyAllFilesToOnefolder target, czyli co VS2010 wywołania zanim to zrobi jego Ręczna kopia. Jakieś kopanie w Microsoft.Www.Wydawnictwo.cele pokazuje, że wywołanie tego celu powoduje pliki projektu, które mają być umieszczone w katalogu określonym przez nieruchomość _PackageTempDir.

Pierwszym zadaniem, które wywołujemy w naszym celu, jest zadanie błędu, na które postawiliśmy warunek, który gwarantuje, że zadanie zostanie wykonane tylko wtedy, gdy właściwość PublishDestination nie została ustawiona. To cię złapie i błąd w kompilacji w przypadku, gdy zapomniałeś podać na PublishDestination property. Następnie wywołujemy zadanie MakeDir, aby utworzyć katalog PublishDestination, jeśli jeszcze nie istnieje.

Następnie definiujemy element o nazwie PublishFiles, który reprezentuje wszystkie pliki znalezione w folderze _PackageTempDir. Zadanie kopiowania jest wtedy wywołane, które kopiuje wszystkie te pliki do folderu docelowego Publish. Atrybut DestinationFiles na elemencie kopiującym jest nieco złożony; dokonuje transformacji przedmiotów i konwertuje ich drogi do nowego ścieżki zakorzenione w folderze PublishDestination (sprawdź dobrze znane Metadane pozycji, aby zobaczyć, co oznaczają te %() s).

Aby wywołać ten cel z wiersza poleceń możemy teraz po prostu wykonać to polecenie (oczywiście zmiana nazwy pliku projektu i właściwości do ciebie):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
 39
Author: P. Roe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 20:59:37

Nadal miałem problemy po wypróbowaniu wszystkich powyższych odpowiedzi (używam Visual Studio 2013). Nic nie zostało skopiowane do folderu publish.

Haczyk polegał na tym, że jeśli uruchamiam MSBuild z indywidualnym projektem zamiast rozwiązania, muszę umieścić dodatkowy parametr określający wersję Visual Studio:

/p:VisualStudioVersion=12.0

12.0 jest dla VS2013, zastąp używaną wersją. Po dodaniu tego parametru po prostu zadziałało.

Kompletny wiersz poleceń wygląda następująco to:

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0

Znalazłem go tutaj:

Http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

Podają:

Jeśli określisz indywidualny projekt zamiast rozwiązania, musisz dodać parametr określający wersję Visual Studio.

 18
Author: felix-b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 09:32:49

Wygląda na to, że Twój profil publikacji nie jest używany i robi jakieś Domyślne Opakowanie. Cele publikowania w sieci Microsoft robią wszystko, co robisz powyżej, wybiera odpowiednie cele na podstawie konfiguracji.

Mam swój do pracy bez problemu z TeamCity MSBuild step, ale podałem jawną ścieżkę do profilu, wystarczy nazwać go po imieniu bez .pubxml (np. FileSystemDebug). Znajdzie się tak długo, jak w standardowym folderze, który twój jest.

Przykład:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug

Uwaga zostało to wykonane przy użyciu wersji Visual Studio 2012 Microsoft Web Publish targets, zwykle znajduje się w "C:\Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web". Sprawdź folder wdrożenia dla określonych typów docelowych, które są używane

 11
Author: GregS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 11:32:03

Najpierw sprawdź wersję Visual studio programisty PC, która może opublikować rozwiązanie (projekt). jak pokazano jest dla VS 2013

 /p:VisualStudioVersion=12.0

Dodaj powyższy wiersz poleceń, aby określić, jakiego rodzaju wersja visual studio ma budować projekt. Jak poprzednie odpowiedzi może się to zdarzyć, gdy staramy się opublikować tylko jeden projekt, a nie całe rozwiązanie.

 0
Author: shammakalubo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-30 19:57:57