我正在处理的项目有多个web.<env>.config
文件。我发现像<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" />
这样的元素中的变量仅在主web.config文件中被替换,但是它们需要在所有.config文件中进行更新。我对这个问题的解决方案是编写一个PowerShell脚本,该脚本在构建项目并更新其他.config文件后采用%LAUNCHER_PATH%
和%LAUNCHER_ARGS%
的值。
我编写的脚本按预期工作,但是当我在更新文件后在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 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>
的正上方。
是否有一种方法可以强制保存操作不插入注释?如果不可能,是否有办法纠正注释,以使注释与文件的其余部分相比没有不一致的行尾?
答案 0 :(得分:1)
似乎您应该处理您自己有权控制的部分,该部分正在编写文件本身,以确保其换行符与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()
}
}
}