Сохранение XML с помощью PowerShell всегда вставляет комментарий с несовместимыми окончаниями строк - PullRequest
0 голосов
/ 11 октября 2018

В проекте, над которым я работаю, есть несколько web.<env>.config файлов.Я обнаружил, что переменные в элементе типа <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" /> заменяются только в основном файле web.config, но их необходимо обновить во всех файлах .config.Мое решение этой проблемы состояло в том, чтобы написать сценарий PowerShell, который принимает значения %LAUNCHER_PATH% и %LAUNCHER_ARGS% после сборки проекта, и обновить другие файлы .config.

Сценарий, который я написал, работает как задумано, но когда я открываю обновленный файл в Visual Studios после того, как я обновил его, и приложение жалуется, что файл имеет несовместимые окончания строк, когда до запуска такого предупрежденияскрипт.Я подтвердил в Notepad ++, что есть определенные строки, которые содержат LF, а не CR LF, и они относятся к этому комментарию, который постоянно вставляется в мой файл.

  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->

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

Скрипт

# Updates web.{env}.config files with the correct processPath and arguments
# that are populated in web.config during the publish process 

$folder = "."
$nodeXpath = "configuration/system.webServer/aspNetCore"

if (Test-Path "$folder\web.config") 
{
    $originalNode = Select-Xml -Path "$folder\web.config" -XPath $nodeXpath | Select-Object -ExpandProperty Node
    $processPath = Select-Xml -XPath "@processPath" -Xml $originalNode
    $arguments = Select-Xml -XPath "@arguments" -Xml $originalNode

    Get-ChildItem $folder -Filter web.*.config |
    Foreach-Object {
        # Using .NET XmlDocument
        $xml = New-Object System.Xml.XmlDocument
        $xml.PreserveWhitespace = $true
        $xml.Load($_)
        #$node = Select-Xml -Xml $xml -XPath $nodeXpath | Select-Object -ExpandProperty Node
        #$node.SetAttribute("processPath", $processPath)
        #$node.SetAttribute("arguments", $arguments)
        $xml.Save((Resolve-Path $_))
    }
}

XML, считываемый и сохраняемый в

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
    <security>
      <authorization>
        <remove users="*" roles="" verbs="" />
        <add accessType="Allow" users="blah" />
        <add accessType="Allow" roles="blahblah" />
        <add accessType="Allow" roles="blahblahblah" />
      </authorization>
      <authentication>
        <windowsAuthentication enabled="true" />
        <anonymousAuthentication enabled="false" />
      </authentication>
    </security>
  </system.webServer>
</configuration>

Комментарий будет вставлен прямо над <system.webServer>.

Есть ли способ заставить действие сохранения не вставлять комментарий?Если это невозможно, есть ли способ исправить комментарий так, чтобы он не имел непоследовательных окончаний строк по сравнению с остальной частью файла?

1 Ответ

0 голосов
/ 11 октября 2018

Похоже, что вместо этого вы должны обработать часть, над которой do имеет контроль, и которая записывает сам файл, чтобы убедиться, что его разрывы строк соответствуют тому, что добавляет Visual Studio.Кажется, что комментарий добавляется с LF только тогда, когда остальная часть вашего файла использует CRLF.

Вы можете управлять выводом, создавая собственный XmlWriter с его собственными настройками:

$folder = "."
$nodeXpath = "configuration/system.webServer/aspNetCore"

if (Test-Path "$folder\web.config") 
{
    $originalNode = Select-Xml -Path "$folder\web.config" -XPath $nodeXpath | Select-Object -ExpandProperty Node
    $processPath = Select-Xml -XPath "@processPath" -Xml $originalNode
    $arguments = Select-Xml -XPath "@arguments" -Xml $originalNode

    $settings = [System.Xml.XmlWriterSettings]::new()
    $settings.NewLineChars = "`n"

    Get-ChildItem $folder -Filter web.*.config |
    Foreach-Object {
        # Using .NET XmlDocument
        $xml = New-Object System.Xml.XmlDocument
        $xml.PreserveWhitespace = $true
        $xml.Load($_)
        #$node = Select-Xml -Xml $xml -XPath $nodeXpath | Select-Object -ExpandProperty Node
        #$node.SetAttribute("processPath", $processPath)
        #$node.SetAttribute("arguments", $arguments)

        $writer = [System.Xml.XmlWriter]::Create((Resolve-Path $_), $settings)
        try {
            $xml.Save($writer)
        } finally {
            $writer.Close()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...