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

如何使用MSBuild任务和目标文件创建NuGet包,nuget,nuget-spec,Nuget,Nuget Spec,我使用的是NuGet 2.8.50506.491。我创建了两个带有自定义Microsoft Build tasks和helper函数的C#项目。有一个目标文件。看起来像这样 $id$ $version$ 我的任务 沃纳斯特里多姆酒店 沃纳斯特里多姆酒店 http://example.org/LICENSE http://example.org/ 假的 示例任务。 首次发布 版权所有2014 Werner Strydom 在Visual Studio项目文件中,我将BuildPackage属性

我使用的是
NuGet 2.8.50506.491
。我创建了两个带有自定义Microsoft Build tasks和helper函数的
C#
项目。有一个目标文件。看起来像这样


$id$
$version$
我的任务
沃纳斯特里多姆酒店
沃纳斯特里多姆酒店
http://example.org/LICENSE
http://example.org/
假的
示例任务。
首次发布
版权所有2014 Werner Strydom
在Visual Studio项目文件中,我将
BuildPackage
属性设置为
true


调试
任意CPU
{96535580-0000-0000-0000-2843D7EC2767}
图书馆
性质
我的任务
我的任务
v4.0
512
真的
当我构建项目时,会创建一个
nupkg
。我将扩展名改为
zip
,并查看了文件的内容。项目的输出位于
lib/net40
文件夹中。因此,当我将这个包添加到另一个项目中时,它还会添加对这些程序集的引用,这是不需要的,因为这个包纯粹用于构建


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

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

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

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

另一种方法是在创建包时只使用.nuspec文件。使用.nuspec文件,您可以完全控制进入NuGet包的内容

NuGet.exe pack YourManifest.nuspec

除非修改nuget源代码,否则使用“nuget pack YourProject.csproj”似乎是不可能的。将项目与nuget pack一起使用时,始终会将输出程序集添加到lib目录。如果您更新它以获得正确的元数据,则可以使用“nuget pack YourManifest.nuspec”。奇怪的是,当我构建属性BuildPackage设置为true的项目时,似乎正在使用YourManifest.nuspec。nuget.exe将使用.nuspec文件获取项目本身可能不支持的额外元数据。但是,当您执行“NuGet pack YourProject.csproj”时,查看NuGet源代码,您的项目输出的.dll或.exe总是添加到lib目录中。如果不使用“nuget pack YourManifest.nuspec”,似乎没有办法覆盖这个问题。请在答案中注明,我会给您评分。