2015-06-16 5 views
0

Я пытаюсь автоматизировать развертывание приложения ClickOnce. Компиляция довольно прямолинейна (насколько я могу судить), однако я никогда не вижу, как генерируется setup.exe. Я даже не уверен, нужно ли генерировать setup.exe во время сборки или во время развертывания, я уверен, что он должен быть при развертывании. (Я генерирую и подписываю манифесты во время моего развертывания, чтобы они были уникальными для каждой среды dev/qual/production)Создание setup.exe (bootstrapper) во время развертывания

примечание: я никогда раньше не работал над ClickOnce, и я не разработал этот проект, мне просто поручено автоматизация его развертывания. Если я пропустил что-либо, спросите в комментариях.

Вот как я скомпилировать

# https://github.com/transcanada/poshBAR/blob/master/src/poshBAR/MSBuild.ps1#L136 
Invoke-CleanMSBuild $this.solutions.uiShell 

# https://github.com/transcanada/poshBAR/blob/master/src/poshBAR/MSBuild.ps1#L63 
Invoke-MSBuild "$($this.artifactsDir.output)\ClickOnce" ` 
     $this.solutions.uiShell ` 
     -target 'package' ` 
     -toolsVersion 4.0 ` 
     -maxCpuCount 8 ` 
     -VisualStudioVersion 12.0 ` 
     -logPath $this.artifactsDir.logs ` 
     -namespace 'TransCanada.MCA' ` 
     -customParameters @('/p:BootstrapperEnabled=true') 

А вот мой csproj файл (за исключением зависимостей).

<?xml version="1.0" encoding="Windows-1252"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProductVersion>9.0.30729</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{62B89443-7C08-4753-9C43-F53DABF7549D}</ProjectGuid> 
    <OutputType>WinExe</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>TransCanada.MCA.UI.Shell</RootNamespace> 
    <AssemblyName>TransCanada.MCA.UI.Shell</AssemblyName> 
    <SccProjectName> 
    </SccProjectName> 
    <SccLocalPath> 
    </SccLocalPath> 
    <SccAuxPath> 
    </SccAuxPath> 
    <SccProvider> 
    </SccProvider> 
    <StartupObject>TransCanada.MCA.UI.Shell.ShellApplication</StartupObject> 
    <IsWebBootstrapper>true</IsWebBootstrapper> 
    <ManifestCertificateThumbprint>98073FFOOBARBAZFIZZBUZZ19CD2F1A4</ManifestCertificateThumbprint> 
    <ManifestKeyFile> 
    </ManifestKeyFile> 
    <GenerateManifests>true</GenerateManifests> 
    <SignManifests>false</SignManifests> 
    <TargetZone>LocalIntranet</TargetZone> 
    <ApplicationIcon>Resources\MCAIcon.ico</ApplicationIcon> 
    <FileUpgradeFlags> 
    </FileUpgradeFlags> 
    <OldToolsVersion>3.5</OldToolsVersion> 
    <UpgradeBackupLocation> 
    </UpgradeBackupLocation> 
    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion> 
    <TargetFrameworkProfile /> 
    <Install>true</Install> 
    <InstallFrom>Web</InstallFrom> 
    <UpdateEnabled>true</UpdateEnabled> 
    <UpdateMode>Foreground</UpdateMode> 
    <UpdateInterval>7</UpdateInterval> 
    <UpdateIntervalUnits>Days</UpdateIntervalUnits> 
    <UpdatePeriodically>false</UpdatePeriodically> 
    <UpdateRequired>false</UpdateRequired> 
    <MapFileExtensions>true</MapFileExtensions> 
    <InstallUrl>http://localhost/</InstallUrl> 
    <TargetCulture>en</TargetCulture> 
    <ProductName>MCA - Dev</ProductName> 
    <PublisherName>TransCanada</PublisherName> 
    <MinimumRequiredVersion>0.1.1.1</MinimumRequiredVersion> 
    <CreateWebPageOnPublish>true</CreateWebPageOnPublish> 
    <WebPage>publish.htm</WebPage> 
    <ApplicationRevision>0</ApplicationRevision> 
    <ApplicationVersion>0.1.1.1</ApplicationVersion> 
    <UseApplicationTrust>false</UseApplicationTrust> 
    <CreateDesktopShortcut>true</CreateDesktopShortcut> 
    <PublishWizardCompleted>true</PublishWizardCompleted> 
    <BootstrapperEnabled>true</BootstrapperEnabled> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\Debug\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    <UseVSHostingProcess>false</UseVSHostingProcess> 
    <PlatformTarget>AnyCPU</PlatformTarget> 
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks> 
    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 
    <Prefer32Bit>false</Prefer32Bit> 
    <CreateDesktopShortcut>true</CreateDesktopShortcut> 
    <BootstrapperEnabled>true</BootstrapperEnabled> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <DebugType>pdbonly</DebugType> 
    <Optimize>true</Optimize> 
    <OutputPath>bin\Release\</OutputPath> 
    <DefineConstants> 
    </DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    <UseVSHostingProcess>false</UseVSHostingProcess> 
    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> 
    <Prefer32Bit>false</Prefer32Bit> 
    <PlatformTarget>AnyCPU</PlatformTarget> 
    <CreateDesktopShortcut>true</CreateDesktopShortcut> 
    <BootstrapperEnabled>true</BootstrapperEnabled> 
    </PropertyGroup> 
    <PropertyGroup> 
    <NoWin32Manifest>true</NoWin32Manifest> 
    </PropertyGroup> 

Решение также имеет customized.targets файл, но я не уверен, если это даже получение взял.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 

<Target Name="UpdateCommonAssemblyInfo"> 
    <AssemblyInfo 
        CodeLanguage="CS" 
        OutputFile="@(AssemblyInfoFiles)" 
        AssemblyVersion="$(VersionNum)" 
        AssemblyFileVersion="$(VersionNum)" 
        /> 
    </Target> 


<PropertyGroup> 
    <BuildEnvironment>Debug</BuildEnvironment> 
</PropertyGroup> 

<Choose> 
    <When Condition=" '$(BuildEnvironment)' == 'Debug' "> 
     <PropertyGroup>  
     <PublishDir>publish\$(BuildEnvironment)\</PublishDir> 
     </PropertyGroup> 
    </When> 
    <When Condition=" '$(BuildEnvironment)' == 'Dev' "> 
     <PropertyGroup>  
     <!--<PublishDir>publish\$(BuildEnvironment)\</PublishDir>--> 
     <PublishDir>C:\inetpub\wwwroot\apps\MCA\Client\Azure\</PublishDir> 
     </PropertyGroup> 
    </When> 
    <When Condition=" '$(BuildEnvironment)' == 'Azure' "> 
     <PropertyGroup> 
     <PublishDir>\\xxxxxxxxxxx\apps\MCA\client\$(BuildEnvironment)\</PublishDir> 
     </PropertyGroup> 
    </When> 
    <When Condition=" '$(BuildEnvironment)' == 'Qual' "> 
     <PropertyGroup> 
     <PublishDir>\\xxxxxxxxxxx\cal\APPS\MCA\Client\$(BuildEnvironment)\</PublishDir> 
     </PropertyGroup> 
    </When> 
    <When Condition=" '$(BuildEnvironment)' == 'Qual2MatrixProd' "> 
     <PropertyGroup> 
     <PublishDir>\\xxxxxxxxxxx\cal\APPS\MCA\Client\$(BuildEnvironment)\</PublishDir> 
     </PropertyGroup> 
    </When> 
    <When Condition=" '$(BuildEnvironment)' == 'Prod' "> 
     <PropertyGroup> 
     <PublishDir>\\xxxxxxxxxxx\cal\APPS\MCA\Client\$(BuildEnvironment)\</PublishDir> 
     </PropertyGroup> 
    </When> 
</Choose> 

<PropertyGroup> 
     <!-- Note this must be done AFTER the above Choose (so PublishDir is set)--> 
    <PublishFilePath>$(PublishDir)publish.html</PublishFilePath> 
    </PropertyGroup> 

<ItemGroup> 
     <Tokens Include="PublisherName"> 
      <ReplacementValue>$(PublisherName)</ReplacementValue> 
      <Visible>false</Visible> 
     </Tokens> 
     <Tokens Include="ProductName"> 
      <ReplacementValue>$(ProductName)</ReplacementValue> 
      <Visible>false</Visible> 
     </Tokens> 
     <Tokens Include="ApplicationVersion"> 
      <ReplacementValue>$(ApplicationVersion)</ReplacementValue> 
      <Visible>false</Visible> 
     </Tokens> 
     <Tokens Include="Prerequsites"> 
      <ReplacementValue>@(BootstrapperPackage->'&lt;li&gt;%(ProductName)&lt;/li&gt;','%0D%0A')</ReplacementValue> 
      <Visible>false</Visible> 
     </Tokens> 
     <Tokens Include="Username"> 
      <ReplacementValue>$(Username)</ReplacementValue> 
      <Visible>false</Visible> 
     </Tokens> 
    </ItemGroup> 
<!--<Target Name="AfterPublish"> 
    <Time Format="dd/MM/yyyy HH:mm"> 
     <Output TaskParameter="FormattedTime" PropertyName="PublishTime" /> 
    </Time> 
    <TemplateFile Template="publish\publish.template.html" Tokens="@(Tokens)" OutputFilename="$(PublishFilePath)" /> 
    <FileUpdate Files="$(PublishFilePath)" Regex="\${PublishTime}" ReplacementText="$(PublishTime)" /> 
</Target> --> 
</Project> 

Что мне не хватает при создании загрузочного буфера?

+0

Может ли отсутствовать задача GenerateBootStrapper? http://stackoverflow.com/questions/3735788/generate-setup-exe-for-clickonce-deployment-from-command-line-using-msbuild#3852373 – Kev

+0

@kev, да, я посмотрел на это. Странная вещь заключается в том, что они * разворачиваются из работы visual studio *. –

+0

Я провел последние два часа, пытаясь заставить это работать. Я действительно ненавижу то, как VS скрывает от вас магию, например, как, черт возьми, он запускает задачу GenerateBootstrapper. – Kev

ответ

1

Я бы просто вручную создавал загрузчик для каждой среды через публикацию Visual Studio, а затем выполнял. Есть ли причина, почему это не сработает?

Единственная причина, по которой вам понадобится восстановить загрузчик, - это изменение ваших предварительных условий или изменение URL-адреса развертывания приложения. Оба они кажутся довольно редко встречающимися.

+0

Я смотрел глубже, и я думаю, что мне нужно будет только setup.exe во время сборки. Затем, когда я меняю конфигурации в разных средах, я уверен, что смогу повторно использовать setup.exe. Проблема в том, что msbuild не генерирует ATM setup.exe. По-прежнему работает через почему. –

+0

Я говорю, я не вижу необходимости создавать сборку setup.exe. Файл setup.exe не изменяется из сборки для сборки. Создайте его один раз с публикацией из VS (который, как вы сказали, работает) и двигайтесь дальше. – codeConcussion

+0

, в то время как это обычно верно, если в процессе разработки добавлена ​​новая зависимость, настройка должна быть сгенерирована повторно. Ручное создание этих вещей летит перед лицом дефонов ИМО. –

Смежные вопросы