我正在开发一个nuget包来帮助标准化一些ASP.NET Web API项目。 nuget包应该执行的部分工作是启用XML文档(如果已禁用),因此可以在帮助区域中使用来自控制器的XML注释。我已经在我的nuget包中为Install.ps1创建了powershell脚本,但它似乎并没有真正改变csproj文件。我正在将软件包安装到一个全新的Web API项目中,并且禁用了XML文档文件,并且它没有按照我的预期运行。我知道它正在运行,因为我还有其他一些必须修复的错误,但是现在我没有收到任何错误或反馈来暗示出现了什么问题。任何帮助都表示赞赏,因为在安装nuget软件包时,在visual studio中调用它的方式似乎很难调试。
param($installPath, $toolsPath, $package, $project)
$doc = New-Object System.Xml.XmlDocument
$doc.Load($project.FullName)
$nsManager = New-Object System.Xml.XmlNamespaceManager($doc.NameTable)
$nsManager.AddNamespace('tu','http://schemas.microsoft.com/developer/msbuild/2003')
$node = $doc.SelectSingleNode('//tu:PropertyGroup',$nsManager)
$docNode = $node.SelectSingleNode('//tu:DocumentationFile', $nsManager)
if(!$docNode)
{
# need to add documentation file
$element = $doc.CreateElement('DocumentationFile')
$element.InnerText = 'App_Data\MyProject.xml'
$node.AppendChild($element)
$doc.Save($project.FullName)
}
答案 0 :(得分:1)
我正在解决这个问题,这是我的解决方案。请记住我正在为一个web项目开发一个nuget包,所以将bin文件夹中的xml文件作为默认设置是有意义的,而不是像bin \ Debug或bin \ Release或App_Data那样在原始问题中
param($installPath, $toolsPath, $package, $project)
# save project first
$project.Save()
$xml = [xml](Get-Content -path $project.FullName)
$default = $xml.Project.PropertyGroup | Where-Object { $_.Condition -eq $null -and $_.ProjectGuid -ne $null }
if($default.DocumentationFile -eq $null) {
$path = "bin\$($default.AssemblyName).xml"
$node = $xml.CreateElement('DocumentationFile', $xml.DocumentElement.NamespaceURI)
$node.InnerText = $path
$default.AppendChild($node) | Out-Null
# Write formatted xml
$stringWriter = New-Object System.IO.StringWriter
$xmlWriter = New-Object System.XMl.XmlTextWriter $stringWriter
$xmlWriter.Formatting = “indented”
$xmlWriter.Indentation = 2
$xml.WriteContentTo($xmlWriter)
$xmlWriter.Flush()
$stringWriter.Flush()
$stringWriter.ToString() | Out-File -FilePath $project.FullName -Encoding utf8 -Force
$xmlWriter.Dispose()
$stringWriter.Dispose()
}
答案 1 :(得分:0)
如果其他人遇到类似的问题。我从来没有想过如何使用PowerShell来完成这项工作。我正在使用Write-Host输出XmlDocument并且可以看到它已更新,但我的* .csproj文件从未在$ doc.Save调用时更新。我对此的研究越多,我发现powershell在新版本的nuget中并不是正确的解决方案。如果您使用版本> 2.5的nuget,正确的答案是使用msbuild .props文件来修改属性。在我的例子中,我想设置DocumentationFile属性,所以我在包中创建了一个build子目录,并添加了一个名为 packageid.props 的文件(用实际的nuget包ID替换packageid)。该文件的内容如下所示:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DocumentationFile>App_Data\MyProject.xml</DocumentationFile>
</PropertyGroup>
</Project>
包含此文件后,我的csproj文件会在安装nuget包时更新为链接到props文件,并且DocumentationFile属性已成功设置。