如何在使用nuget pack时避免生成xml文档

时间:2012-11-25 02:50:53

标签: nuget nuget-package

我正在为我的程序集创建包但我不想在我的nuget包中包含docs / * .xml文件。我已经尝试了pack命令的-Exclude开关和nuspec文件中files文件的exclude属性,以明确排除这些文件。这些都没有奏效。因此,每次我生成我的nuget包然后通过在目标项目中安装它来测试它时,它总是添加一个包含所有xml文件的docs文件夹。如何避免将xml文件包含在nuget包中?任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:1)

谢谢Matt,我已经做了你提到的事情,但在我看来,Nuget按惯例做了其他一些事情。即使我像你说的那样使用了排除,也包含了docs文件夹。我通过使用-a开关生成nuspec文件解决了这个问题(我使用的是.csproj文件)。我还必须将.dll文件复制到我的解决方案文件夹之外的文件夹中。这样一切都运行良好,如预期的那样。

无论如何,你的答案是准确的,但在我的情况下它没有用。不确定这是否符合设计要求。 这是我目前用于生成包的最终msbuild文件。希望Nuget很快就会在spec命令中添加更多开关,这样我们就不必在之后修改nuspec文件了。

<Project DefaultTargets="NugetPackage" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  

<PropertyGroup>
 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
 <OutputPathCore>NugetPkgs\$(Configuration)\My.Assembly</OutputPathCore>
 <NuGetExePath>assets\nuget.exe</NuGetExePath>     

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks"/>

<Target Name="NugetPackage" DependsOnTargets="PackageClean;BuildNugetPackageMyAssembly">   

<Target Name="PackageClean">  
<RemoveDir Directories ="NugetPkgs\$(Configuration)" ContinueOnError ="true"/>  

<Target Name="BuildNugetPackageMyAssembly">   
   <MakeDir Directories="$(OutputPathCore)" />
   <MakeDir Directories="$(OutputPathCore)\Package" />
   <MakeDir Directories="$(OutputPathCore)\lib\net40" />
   <MakeDir Directories="$(OutputPathCore)\lib\net20" />      
   <MakeDir Directories="$(OutputPathCore)\lib\net20-cf" />   

   <Copy
       DestinationFolder="$(OutputPathCore)\lib\net40" 
       SourceFiles="Source\My.Assembly\bin\$(Configuration)\My.Assembly.dll" />

    <Copy
       DestinationFolder="$(OutputPathCore)\lib\net20" 
       SourceFiles="VS2008\Source\My.Assembly\bin\$(Configuration)\My.Assembly.dll" />

    <Copy
       DestinationFolder="$(OutputPathCore)\lib\net20-cf" 
       SourceFiles="VS2008\Source\My.Assembly.CF\bin\$(Configuration)\My.Assembly.CF.dll" />

   <Copy DestinationFolder="$(OutputPathCore)\content" SourceFiles="CHANGES" />

   <Copy SourceFiles="Release Notes.txt" DestinationFiles="$(OutputPathCore)\Readme.txt" />

   <Exec Command="&quot;$(NuGetExePath)&quot; spec -a  &quot;$(OutputPathCore)\lib\net40\My.Assembly.dll&quot;" />              

    <XmlUpdate Namespace="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" XmlFileName="My.Assembly.nuspec" XPath="//package/metadata/licenseUrl" Value="http://someurl" />          
    <XmlUpdate Namespace="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" XmlFileName="My.Assembly.nuspec" XPath="//package/metadata/projectUrl" Value="http://someurl" />          
    <XmlUpdate Namespace="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" XmlFileName="My.Assembly.nuspec" XPath="//package/metadata/iconUrl" Value="http://somenice.png" />            
    <XmlUpdate Namespace="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" XmlFileName="My.Assembly.nuspec" XPath="//package/metadata/tags" Value="My.Assembly" />           
    <XmlUpdate Namespace="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" XmlFileName="My.Assembly.nuspec" XPath="//package/metadata/releaseNotes" Value="Review readme.txt for details." />  

<ItemGroup>      
  <file Include="Source\My.Assembly\bin\$(Configuration)\My.Assembly.dll"/>
  <file Include="VS2008\Source\My.Assembly\bin\$(Configuration)\My.Assembly.dll"/>    
  <file Include="$(OutputPathCore)\Readme.txt"/>
</ItemGroup>

<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="RemoveElement" File="My.Assembly.nuspec" Element="dependencies" XPath="//package/metadata/dependencies" />

<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="AddElement" File="My.Assembly.nuspec" Key="" Value="" Element="files" XPath="//package" InsertAfterXPath="//package" />
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="AddElement" File="My.Assembly.nuspec" Key="src" Value="%(file.Identity)" Element="file" XPath="//package/files" />

<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="AddAttribute" File="My.Assembly.nuspec" XPath="//package/files/*[1]"  Key="target" Value="lib\net40" />
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="AddAttribute" File="My.Assembly.nuspec" XPath="//package/files/*[2]"  Key="target" Value="lib\net20" />  
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="AddAttribute" File="My.Assembly.nuspec" XPath="//package/files/*[3]"  Key="target" Value=""/>


<Exec Command="&quot;$(NuGetExePath)&quot; pack My.Assembly.nuspec -OutputDirectory &quot;$(OutputPathCore)\Package&quot; -NoPackageAnalysis" />

<Delete Files ="My.Assembly.nuspec" /> 

答案 1 :(得分:0)

要排除所有.xml文件,您应该使用** \ * .xml通配符。我猜你正在使用* .xml,这将无法正常工作。

要排除所有.xml文件,您可以使用类似于以下内容的nuget命令行:

nuget.exe pack MyPackage.nuspec -Exclude **\*.xml

如果您只需要在docs目录中排除.xml文件,那么您可以使用类似于以下内容的nuget命令行:

nuget.exe package MyPackage.nuspec -Exclude **\docs\*.xml

通配符似乎相对于.nuspec文件所在的文件夹有效。如果相对于.nuspec文件的docs子文件夹中有.xml文件,那么如果docs * .xml也可以使用通配符。

答案 2 :(得分:0)

我能想到的另一件事是

  1. 创建一个nuspec文件并进行编辑。这只需要完成一次(也可以检查)。你在编译时编辑nuspec文件的原因是什么?
  2. 使用nuspec文件中的files元素将文件复制到目标文件夹
  3. &LT;文件&GT;   &lt; file src =“bin \ Debug \ * .dll”target =“lib”/&gt;   &lt; file src =“bin \ Debug \ * .pdb”target =“lib”/&gt;   &lt; file src =“tools \ * \ 。*”exclude =“* \ .log”/&gt; &LT; /文件&GT;

     3. pack命令可以在构建时完成。

    有关文件的更多详情,请访问http://docs.nuget.org/docs/reference/nuspec-reference