Files
mht-siemens/packages/PrettyBin.1.1.0/tools/install.ps1
T
2020-05-11 17:18:07 +02:00

157 lines
5.2 KiB
PowerShell

param($installPath, $toolsPath, $package, $project)
$path = $project.FullName
$appConfigItem = $project.ProjectItems | where {$_.Name -eq "App.config"}
if ($appConfigItem -eq $null)
{
throw [System.IO.FileNotFoundException] "Project $path does not have App.config. PrettyBin is for exetutable projects only. "
}
Write-Host 'Install PrettifyBin; '
[xml]$doc = [xml](Get-Content $path)
# If a Namespace URI was not given, use the Xml document's default namespace.
$NamespaceURI = $doc.DocumentElement.NamespaceURI
Write-Host $NamespaceURI
# In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($doc.NameTable)
$xmlNsManager.AddNamespace("ns", $NamespaceURI)
# ============ This script attemps to Create this tags in csproj: ========
#
# <Target Name="AfterBuild">
# <ItemGroup>
# <MoveToLibFolder Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
# </ItemGroup>
# <Move SourceFiles="@(MoveToLibFolder)" DestinationFolder="$(OutputPath)lib" OverwriteReadOnlyFiles="true" />
# </Target>
$targetNode = $doc.SelectSingleNode("//ns:Project/ns:Target[@Name='AfterBuild']", $xmlNsManager)
if ($targetNode -eq $null)
{
Write-Host 'No Target AfterBuild Node. Creating'
$targetNode = $doc.CreateElement('Target', $NamespaceURI )
$targetNode.SetAttribute("Name" ,"AfterBuild")
$doc.Project.AppendChild($targetNode)
}
$filesToMoveNode = $targetNode.SelectSingleNode("//ns:ItemGroup/ns:MoveToLibFolder", $xmlNsManager)
if ($filesToMoveNode -eq $null)
{
Write-Host 'No ItemGroup whith MoveToLibFolder tag. Creating'
$itemGroup = $doc.CreateElement('ItemGroup', $NamespaceURI)
$filesToMoveNode = $doc.CreateElement('MoveToLibFolder', $NamespaceURI)
$itemGroup.AppendChild($filesToMoveNode)
$targetNode.AppendChild($itemGroup)
}
$filesToMoveNode.SetAttribute("Include" ,'$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml')
$MoveNode = $targetNode.SelectSingleNode('//ns:Move[contains(@SourceFiles,"@(MoveToLibFolder)")]', $xmlNsManager)
if ($MoveNode -eq $null)
{
Write-Host 'No Move tag in AfterBuild Target. Creating'
$MoveNode = $doc.CreateElement('Move', $NamespaceURI)
$MoveNode.SetAttribute("SourceFiles" ,'@(MoveToLibFolder)')
$targetNode.AppendChild($MoveNode)
}
$MoveNode.SetAttribute("DestinationFolder",'$(OutputPath)lib')
$MoveNode.SetAttribute("OverwriteReadOnlyFiles","true")
$doc.Save($path)
# ============ This script attemps to Edit this tags in App.config: ========
#
# <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
# <runtime>
# <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
# <probing privatePath="lib;libs" />
# </assemblyBinding>
# </runtime>
# </configuration>
Write-Host 'Edititing App.config'
# find the App.config file
$configItem = $project.ProjectItems | where {$_.Name -eq "App.config"}
# find its path on the file system
$configPath= $configItem.Properties | where {$_.Name -eq "LocalPath"}
# Get XML content of App.config
[xml]$app = [xml](Get-Content $configPath.Value)
# If a Namespace URI was not given, use the Xml document's default namespace.
$NamespaceAppURI = $app.DocumentElement.NamespaceURI
# In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
$xmlNsManager.AddNamespace("appns", $NamespaceAppURI)
# Adding of configuration section
$configurationNode = $app.SelectSingleNode("//appns:configuration", $xmlNsManager)
if ($configurationNode -eq $null)
{
Write-Host 'No Configuration Node. Creating'
# Для чего тут нужен NamespaceURI
$configurationNode = $app.CreateElement('Configuration', $NamespaceAppURI )
$configurationNode.SetAttribute("xmlns:xdt" ,"http://schemas.microsoft.com/XML-Document-Transform")
$app.AppendChild($configurationNode)
}
# Adding of runtime section
$runtimeNode = $configurationNode.SelectSingleNode("//appns:runtime", $xmlNsManager)
if ($runtimeNode -eq $null)
{
Write-Host 'No runtime Node. Creating'
$runtimeNode = $app.CreateElement('runtime', $NamespaceAppURI )
$configurationNode.AppendChild($runtimeNode)
}
# Adding of assemblyBinding section
Write-Host 'runtimeNode items'
$assemblyBindingNode = $null
foreach ($item in $runtimeNode.ChildNodes)
{
if ($item.Name -eq 'assemblyBinding')
{
$assemblyBindingNode = $item
break
}
}
#$assemblyBindingNode = $runtimeNode.SelectSingleNode("//appns:assemblyBinding", $xmlNsManager)
if ($assemblyBindingNode -eq $null)
{
Write-Host 'No assemblyBinding Node. Creating'
$assemblyBindingNode = $app.CreateElement('assemblyBinding', $NamespaceAppURI )
$runtimeNode.AppendChild($assemblyBindingNode)
}
$assemblyBindingNode.SetAttribute("xmlns" ,"urn:schemas-microsoft-com:asm.v1")
# Adding of probing section
$probingNode = $assemblyBindingNode.SelectSingleNode("//appns:probing", $xmlNsManager)
if ($probingNode -eq $null)
{
Write-Host 'No probing Node. Creating'
$probingNode = $app.CreateElement('probing', $NamespaceAppURI )
$assemblyBindingNode.AppendChild($probingNode)
}
$probingNode.SetAttribute("privatePath" ,"lib;libs")
$app.save($configPath.Value)