【问题标题】:How to create a NuGet package with MSBuild tasks and a targets file如何使用 MSBuild 任务和目标文件创建 NuGet 包
【发布时间】:2014-06-24 08:20:07
【问题描述】:

我正在使用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 文件夹中?

【问题讨论】:

  • 除非修改 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”,似乎没有办法覆盖它。
  • 把它放在一个答案中,我会给你功劳。

标签: nuget nuget-spec


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多