2008-09-04 1 views
29

Каждый раз, когда я публикую приложение в ClickOnce, я получаю его, чтобы обновить номер версии на один. Есть ли способ получить это изменение автоматически, чтобы изменить номер версии в файле AssemblyInfo.cs (все наши отчеты об ошибках смотрят на версию сборки)?Как получить версию публикации ClickOnce в соответствии с версией файла AssemblyInfo.cs?

ответ

30

Мы используем Team Server Team Foundation Build и добавил блок к TFSBuild.proj в AfterCompile цели, чтобы вызвать ClickOnce опубликовать с нашим предпочтительным номером версии:

<MSBuild Projects="$(SolutionRoot)\MyProject\Myproject.csproj" 
     Properties="PublishDir=$(OutDir)\myProjectPublish\; 
        ApplicationVersion=$(PublishApplicationVersion); 
        Configuration=$(Configuration);Platform=$(Platform)" 
     Targets="Publish" /> 

Переменная PublishApplicationVersion генерируется с помощью пользовательских MSBuild чтобы использовать номер набора изменений TFS, но вы можете использовать your own custom task или existing solution, чтобы получить номер версии из файла AssemblyInfo.

Это теоретически можно было бы сделать в файле проекта (это вообще-то сценарий MSBuild), но я бы рекомендовал не развертывать его с машины-разработчика.

Я уверен, что другие решения continuous integration (CI) могут справиться с этим аналогичным образом.


Edit: К сожалению, получил свой вопрос в обратном направлении. Переход от номера версии ClickOnce к файлу AssemblyInfo должен быть выполнимым. Я уверен, что в задачах сообщества MSBuild (ссылка выше) есть задача для обновления файла AssemblyInfo, поэтому вам просто понадобится настраиваемая задача, чтобы вывести номер версии из XML-конфигурации ClickOnce.

Однако, вы можете также рассмотреть вопрос об изменении вашего сообщения об ошибках, чтобы включать ClickOnce опубликовать версию тоже:

if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) 
{ 
    Debug.WriteLine(System.Deployment.Application.ApplicationDeployment. 
                 CurrentDeployment.CurrentVersion); 
} 
0

Возможно, вам понадобится создать фрагмент кода, который обновит AssemblyInfo.cs в соответствии с номером версии, хранящимся в файле .csproj. (Версия развертывания ClickOnce хранится внутри тега XML.)

После этого вы измените файл .csproj, чтобы запустить этот бит кода при выполнении публикации. Пользователи MSBuild рассказывают о том, как выполнять пользовательские действия во время определенных типов сборки; проверьте MSBuild team blog.

2

Шаги:

  1. Использовать внешний инкрементацию номер версии (если использовать непрерывный сервер интеграции, как CruiseControl.NET, то это происходит от этикетки сборки).
  2. Используйте GlobalVersionInfo.cs (ссылка на файл, указанную всеми проектами в вашем решении), чтобы сохранить текущую версию и обновить ее в сборке с помощью задачи AssemblyInfo из задач MSBuild Community.
  3. Сценарий Mage инструмента командной строки из .NET SDK для обновления манифеста ClickOnce с использованием той же версии (см. Переключатели и -mv).

Кстати, приятный бонус в том, что всякий раз, когда вы автоматически опубликовать новую версию ClickOnce развертывания с помощью интеграции скрипта, если вы также указать минимальную версию Mage.exe (такой же, как вариант), то каждый пользователь будет автоматически обновляется при следующем запуске приложения.

4

Я реализовал это в последнее время, используя некоторые пользовательские задачи.Проблема, которую я обнаружил при реализации этого с помощью ClickOnce, заключается в том, что все ваши DLL-файлы обновляются. Это приводит к обновлению ClickOnce для загрузки всех файлов приложений каждое обновление. Это обходит прекрасные возможности развертывания ClickOnce, где только обновленные файлы повторно загружаются в обновление.

Просто что-то подумать о реализации чего-то подобного с помощью ClickOnce.

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