Пакет Nuget для вставки имени проекта в web.config

Я создал пакет Nuget, который вставляет пару ключ/значение с именем ApplicationName в файл web.config со значением по умолчанию Application Name.

Есть ли способ получить имя проекта .Net MVC, в котором пользователь будет устанавливать пакет, в значение ключа/значения в удобочитаемом формате? т. е. неверно: ApplicationName правильно: Application Name

Если невозможно получить имя проекта, я полагаю, может сработать какой-то параметр командной строки?


person dspencer    schedule 02.04.2015    source источник


Ответы (1)


После нескольких дней размышлений, вот решение, которое я придумал.

  1. Создайте файл преобразования web.config, чтобы добавить пару ключ/значение в раздел AppSettings.
  2. Создайте файл install.ps1, который берет имя проекта, анализирует его и вставляет новое значение для AppplicationName в файл web.config.

Вот мой файл web.config.install.xdt:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings xdt:Transform="InsertIfMissing">
    <add key="ApplicationName" value="Application Name" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  </appSettings>
</configuration>

Вот мой install.ps1 скрипт:

# Runs every time a package is installed in a project
param($installPath, $toolsPath, $package, $project)

# $installPath is the path to the folder where the package is installed.
# $toolsPath is the path to the tools directory in the folder where the package is installed.
# $package is a reference to the package object.
# $project is a reference to the project the package was installed to.

$p = Get-Project
$project_readable_name = ($p.Name -creplace  '([A-Z\W_]|\d+)(?<![a-z])',' $&').trim()

# Solution based on answer found on Stackoverflow: http://stackoverflow.com/questions/6901954/can-nuget-edit-a-config-file-or-only-add-to-it
$xml = New-Object xml

# Find the web.config 
$config = $project.ProjectItems | where {$_.Name -eq "Web.config"}

if($config) {
    # Find web.config's path on the file system
    $localPath = $config.Properties | where {$_.Name -eq "LocalPath"}

    # Load Web.config as XML
    $xml.Load($localPath.Value)

    # Select the ApplicationName node
    $node = $xml.SelectSingleNode("configuration/appSettings/add[@key='ApplicationName']")

    # Change the ApplicationName value
    $node.SetAttribute("value", $project_readable_name)

    # Save the Web.config file
    $xml.Save($localPath.Value)
}

Надеюсь, это поможет кому-то еще!

person dspencer    schedule 07.04.2015