Как получить версию публикации ClickOnce, соответствующую версии файла AssemblyInfo.cs?

This Works

Создайте пароль APP Gmail!

После того, как вы создадите, затем создайте файл с именем sendgmail.py

Затем добавьте этот код :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
# Created By  : Jeromie Kirchoff
# Created Date: Mon Aug 02 17:46:00 PDT 2018
# =============================================================================
# Imports
# =============================================================================
import smtplib

# =============================================================================
# SET EMAIL LOGIN REQUIREMENTS
# =============================================================================
gmail_user = 'THEFROM@gmail.com'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'

# =============================================================================
# SET THE INFO ABOUT THE SAID EMAIL
# =============================================================================
sent_from = gmail_user
sent_to = ['THE-TO@gmail.com', 'THE-TO@gmail.com']
sent_subject = "Where are all my Robot Women at?"
sent_body = ("Hey, what's up? friend!\n\n"
             "I hope you have been well!\n"
             "\n"
             "Cheers,\n"
             "Jay\n")

email_text = """\
From: %s
To: %s
Subject: %s

%s
""" % (sent_from, ", ".join(sent_to), sent_subject, sent_body)

# =============================================================================
# SEND EMAIL OR DIE TRYING!!!
# Details: http://www.samlogic.net/articles/smtp-commands-reference.htm
# =============================================================================

try:
    server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    server.ehlo()
    server.login(gmail_user, gmail_app_password)
    server.sendmail(sent_from, sent_to, email_text)
    server.close()

    print('Email sent!')
except Exception as exception:
    print("Error: %s!\n\n" % exception)

Итак, если вы успешны, вы увидите следующее изображение:

Я протестировал, отправив электронное письмо от и для себя.

Примечание. У меня включена двухэтапная аутентификация в моей учетной записи. Пароль приложения работает с этим!

Этот параметр недоступен для учетных записей с включенной двухэтапной аутентификацией. Для таких учетных записей требуется пароль для конкретного приложения для доступа к менее безопасным приложениям.

30
задан Peter Mortensen 22 June 2014 в 11:04
поделиться

4 ответа

Мы используем Сборку Команды Сервера Основы Команды и добавили блок к TFSBuild.proj's AfterCompile, цель для инициирования ClickOnce публикует с нашим числом предпочтительной версии:

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

PublishApplicationVersion переменная сгенерирована пользовательской задачей MSBuild использовать TFS Changeset число, но Вы могли использовать Ваша собственная задача или существующее решение получить номер версии из файла AssemblyInfo.

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

я уверен другой непрерывная интеграция (CI), решения могут обработать это так же.

<час>

Редактирование: Извините, получил Ваш вопрос назад. Движение от номера версии ClickOnce до файла AssemblyInfo должно быть выполнимым. Я уверен, что Задачи Сообщества MSBuild (ссылка выше) имеют задачу для обновления файла AssemblyInfo, таким образом, Вам просто была бы нужна пользовательская задача вытянуть номер версии от конфигурации ClickOnce XML.

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

if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
    Debug.WriteLine(System.Deployment.Application.ApplicationDeployment.
                                                        CurrentDeployment.CurrentVersion);
}
31
ответ дан Marcus Mangelsdorf 22 June 2014 в 11:04
поделиться
  • 1
    Хорошее обходное решение! Однако вместо того, чтобы добавить вручную новый DbSet я полностью удаляю файл контекста перед стартовым процессом шаги выше так, чтобы я использовал исходное имя контекста дб в качестве нового имени модели, и все dbsets создаются для меня автоматически. Я предлагаю удалить пользовательский материал из файла контекста, созданного VS и поместить его в соответствующий частичный класс файла дб контекста. – Bronek 13 November 2016 в 19:42

Шаги:

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

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

2
ответ дан Peter Mortensen 22 June 2014 в 11:04
поделиться
  • 1
    (Очень запоздалый) Точно, что я искал! Спасибо! – David Given 8 August 2015 в 20:37

Необходимо будет, вероятно, создать часть кода, который обновляет AssemblyInfo.cs согласно номеру версии, сохраненному в .csproj файле. (ClickOnce развертываются, версия хранится в XML-тэге.)

Вы тогда изменили бы свой .csproj файл для выполнения этого бита кода, когда сборка Publish|Release выполняется. Люди MSBuild вели блог о том, как выполнить пользовательские действия во время определенных типов сборки; проверьте блог .

команды MSBuild
0
ответ дан Judah Gabriel Himango 22 June 2014 в 11:04
поделиться
  • 1
    Необходимо обеспечить код и объяснить его. There' s много для объяснения. – jww 2 January 2019 в 09:27

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

Просто что-то для размышления о при реализации чего-то вроде этого с ClickOnce.

4
ответ дан Peter Mortensen 22 June 2014 в 22:04
поделиться
  • 1
    Кажется, что это была бы прекрасная идея создать инструмент, который мог обработать это для Вас. – Emulic 7 December 2018 в 06:21
Другие вопросы по тегам:

Похожие вопросы: