如何使用MSBuild任务和目标文件创建NuGet包

时间:2014-06-24 08:20:07

标签: nuget nuget-spec

我正在使用NuGet 2.8.50506.491。我创建了几个C#项目,其中包含自定义Microsoft Build任务和帮助程序功能。有一个目标文件。它看起来像这样。

<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>MyTasks</title>
    <authors>Werner Strydom</authors>
    <owners>Werner Strydom</owners>
    <licenseUrl>http://example.org/LICENSE</licenseUrl>
    <projectUrl>http://example.org/</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Sample tasks.</description>
    <releaseNotes>Initial Release</releaseNotes>
    <copyright>Copyright 2014 Werner Strydom</copyright>
  </metadata>
  <files>
    <file src="MyTasks.targets" target="build/net40" />
    <file src="bin\$configuration$\*.dll" target="build/net40" />
    <file src="bin\$configuration$\*.pdb" target="build/net40" />
  </files>
</package>

在Visual Studio项目文件中,我将BuildPackage属性设置为true

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{96535580-0000-0000-0000-2843D7EC2767}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>MyTasks</RootNamespace>
    <AssemblyName>MyTasks</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <BuildPackage Condition="'$(BuildPackage)' == ''">true</BuildPackage>
</PropertyGroup>

构建项目时,会创建nupkg。我将扩展名更改为zip并查看了文件的内容。项目的输出位于lib/net40文件夹中。因此,当我将此包添加到另一个项目时,它还会添加对这些程序集的引用,这是不需要的,因为此程序包纯粹用于构建。

如何防止项目输出结束在lib文件夹中?

1 个答案:

答案 0 :(得分:3)

BuildPackage属性在NuGet.targets文件中定义。当BuildPackage为true时查看NuGet.targets文件,将运行以下命令行:

NuGet.exe pack YourProject.csproj

如果您使用 NuGet.exe打包YourProject.csproj ,则项目的输出程序集将始终添加到lib目录中。查看NuGet源代码,您无法更改此行为,至少在没有修改NuGet的情况下也是如此。

虽然使用 NuGet包YourProject.csproj 将使用它找到的任何您无法在项目本身中定义的额外元数据的YourProject.nuspec文件,但似乎无法阻止输出程序集添加到lib目录。

替代方法是在创建包时仅使用.nuspec文件。使用.nuspec文件,您可以完全控制NuGet包中的内容。

NuGet.exe pack YourManifest.nuspec