Как перенести из мастера Visual Studio ClickOnce "Опубликовать" в развертывание MSBuild/mage?

До сих пор наше приложение было опубликовано с помощью ClickOnce с помощью мастера "Опубликовать" Visual Studio. Это было довольно болезненно, и мы автоматизировали процесс, используя msbuild/mage.

К сожалению, новое развертывание, похоже, несовместимо со старым, что приводит к ошибке "Идентификатор развертывания не соответствует ошибке подписки" при обновлении (тестировании) пользователей.

Теперь между файлами, созданными с помощью "Публикация" и нашего Мага script, существует множество различий, но мы не можем их устранить. Например, "Издатель", похоже, не соблюдается GenerateDeploymentManifest, а Mage -New Deployment не может установить UpdateMode для Foreground. Существуют и другие подобные случаи.

Кто-нибудь когда-либо успешно отошел от мастера "Опубликовать", не требуя, чтобы вся база пользователей переустанавливала приложение? Каков был ваш подход?

P.S. VisualStudio 2008; все пользователи находятся на платформе .NET Framework 3.5 SP1.

Ответы

Ответ 1

Трюк состоял в том, чтобы сопоставить так называемый идентификатор сборки.

Совет # 1: не используйте Mage для создания манифеста развертывания (файл *.application). Вместо этого используйте GenerateDeploymentManifest. Инструмент "Маг" не имеет двух важных параметров:

  • Маг не дает возможности указать культуру развертывания. Как вы можете видеть из приведенной выше ссылки, если культура не соответствует, то ClickOnce это другое приложение. Уч.
  • Невозможно установить режим обновления на "переднем плане", например, "проверить обновления перед запуском", например, "онлайн-приложение". Хм...

Совет # 2: используйте Маг, чтобы добавить издателя и подписать сертификат развертывания. Это связано с тем, что GenerateDeploymentManifest, по-видимому, игнорирует Publisher (по крайней мере, в 3.5 SP1), и аналогично SignFile не может использовать файл .pfx в качестве ключа. Упс.

<Exec Command='"c:\path\to\mage.exe" -Update "$(MyOutputPath)\MyApp.application" -Publisher MyCompany.com -CertFile path\to\MyAppKey.pfx'/>

Подсказка # 3: чтобы указать правильный относительный путь для поля "codebase" в XML развертывания, используйте следующий фрагмент:

<CreateItem Include="$(MyDeploymentPath)\v$(Version)\MyApp.exe.manifest" AdditionalMetadata="TargetPath=v$(Version)\MyApp.exe.manifest">
  <Output TaskParameter="Include" ItemName="EntryPoint"/>
</CreateItem>

а затем передайте EntryPoint="@(EntryPoint)" в GenerateDeploymentManifest. Ключевым битом является метаданные "TargetPath". Тьфу!

Подсказка № 4: терпение, запас старых рабочих манифестов и хороший удобный инструмент для сравнения.


Является ли это сложным и болезненным? Да! Но лучше ли это Мастер публикации? OH YES!

Изменить. Я опубликовал рабочий пример того, как можно вызвать Мага из MSBuild - однако работа не работает 't означает, что вы можете просто подключить его, так как есть множество настроек, которые вы можете изменить, и вам все равно нужно понять ClickOnce в некоторой степени. Но, надеюсь, это может послужить полезной отправной точкой.