2016-08-17 65 views
0

我正在研究nuget包以帮助标准化一些ASP.NET Web API项目。 Nuget软件包应该做的一部分是启用XML文档,因此可以在帮助区域中使用来自控制器的XML注释。我已经在我的nuget包中为Install.ps1创建了下面的powershell脚本,但它似乎并没有真正改变csproj文件。我正在将该软件包安装到一个全新的Web API项目中,并禁用了XML文档文件,而且这种方式并不按我期望的方式工作。我知道它正在运行,因为我还有一些其他错误必须修复,但现在我没有收到任何错误或反馈意见来提示错误。任何帮助都会受到赞赏,因为在安装nuget软件包时,它在Visual Studio中调用它的方式似乎非常困难。使用nuget包中的Powershell启用CSPROJ XML文档文件

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

万一其他人遇到类似的问题。我从来没有想过如何使用PowerShell的这个工作。我使用Write-Host输出XmlDocument,可以看到它已更新,但是我的* .csproj文件从未更新过$ doc.Save的调用。我在这方面工作得越多,我发现,无论如何,在新版本的nuget中,powershell并不是正确的解决方案。如果您使用版本> 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包时道具文件和DocumentationFile属性,都会设置成功。

+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() 
} 
+0

这个解决方案很好!按预期工作。 –

相关问题