Не публиковать строку подключения SQL при развертывании, если она уже существует с использованием Transforms.

TFS 2015, процесс сборки vNext (не xaml)

Я пытаюсь автоматизировать процесс развертывания веб-приложения MVC. Серверы, которые он будет развертывать, будут иметь разные строки подключения SQL. Таким образом, мое текущее развертывание заключается в том, чтобы вручную скопировать файл web.config в web.config.save, развернуть новую версию с помощью WebDeploy, затем перейти к старому файлу web.config.save и скопировать строку подключения. Сейчас я достиг такого размера, что долго это не продлится. Поэтому мне нужно автоматизировать этот процесс дальше. У меня TFS автоматически создается и развертывается на моем тестовом сервере (который также имеет другую строку подключения, так что это отличный тест). В свойствах «публикации» я попытался снять флажок «Использовать эту строку подключения во время выполнения (обновить место назначения web.config)» в разделе базы данных «публикация настроек», а затем снова проверил проект в TFS. Но при развертывании web.config принял значение по умолчанию. Я не хочу удалять этот параметр, потому что мне нужна строка подключения по умолчанию для новых установок.

Я мог бы написать программу передачи xml, чтобы сохранить текущую строку подключения, а затем перезаписать ее после завершения. Но я подумал, что должен быть способ сделать это с текущим набором инструментов, и зачем пытаться изобретать велосипед?

Я пошел по пути использования преобразований. Итак, я создал файл web.config.release в VS2015, а затем добавил его в файл web.config.release:

<connectionStrings>
   <add xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" name="AppEntities"       connectionString="metadata=res://*/Models.DBName.csdl|res://*/Models.DBName.ssdl|res://*/Models.DBName.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLExpress;initial catalog=DBName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

Итак, кто-нибудь знает, как я могу обновить строку подключения SQL, только если она не существует в текущем файле web.config для развертывания?


person Zonus    schedule 22.01.2017    source источник
comment
Несколько сведений помогут ответить на ваш вопрос: что вы имеете в виду под словом «отключить копирование»? откуда берется файл web.config.save? Какую версию TFS вы используете? Используете ли вы сборку XAML или сборку vNext для TFS2015+ и VSTS?   -  person Luca Cappa    schedule 22.01.2017
comment
Спасибо, обновил квест, чтобы уточнить ваши комментарии.   -  person Zonus    schedule 22.01.2017
comment
Сотрудник рассказал мне о преобразованиях, после чего я нашел эту статью по этому вопросу, похоже, она работает в моем первоначальном тестировании. tomot.de/en-us/article/5/asp.net/   -  person Zonus    schedule 22.01.2017


Ответы (1)


Я получил этот опыт со сборкой TFS 2015 vNext, во втором квартале 2016 года мы назначили человека Dev Ops, который действительно хорошо разбирался в PowerShell, и он взял на себя ответственность за процесс сборки и развертывания. Некоторые из вещей, которые он придумал, были сценарием пост-сборки.

Теперь, чтобы ответить на ваш вопрос: для нас сценарий Post-Build выполнит часть развертывания, и как часть развертывания вы обновите строку подключения в файле web.config. Теперь для этого потребуется, чтобы кто-то в вашей команде действительно хорошо разбирался в PowerShell.

Теперь я бы написал специальное слово в исходном файле, например «{ConStringHere}», и заменил его сценарием Powershell, таким образом, вы замените его только один раз.

Посмотрите, как проверить, содержит ли файл слово, и заменить его с помощью PowerShell: Powershell, используя, чтобы проверить, содержат ли файлы определенное слово< /а>

Я выделю некоторые из преимуществ, с которыми мы столкнулись при использовании этого подхода:

  • Вам не нужно решение, проект и классы для изменения некоторых файлов. Большинство модификаций файлов после сборки можно выполнить в powershell с помощью строки или 2.
  • Вы можете хранить сценарии powershell в TFS, сохраняя историю и комментарии к изменениям.
  • У вас могут быть специальные значения (строки подключения, пользователи, пароли), определенные как переменные сборки, которые легче изменить и обеспечить более высокий уровень безопасности, чем жестко заданные значения в проекте.
  • У вас может быть несколько сценариев для каждой среды. В идеале все сценарии должны быть почти одинаковыми для каждой среды, но, возможно, в процессе производства вы публикуете на 2 разных сервера, поэтому вам нужно будет вызывать строку дважды.
  • Вы сэкономите время разработчиков, поскольку человек, поддерживающий powershell, не обязательно должен быть разработчиком полного стека.
person AL - Divine    schedule 22.01.2017
comment
Похоже, преобразования предназначены только для компиляции. Я не делал сценарий powershell, я мог написать это на C # за считанные минуты, так что в итоге я это сделал. - person Zonus; 24.01.2017