在nuget包

时间:2016-08-17 13:11:13

标签: powershell visual-studio-2015 nuget

我正在开发一个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)
}

2 个答案:

答案 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属性已成功设置。