gpt4 book ai didi

在单个 NuGet 包中 MSBuild 多个 dll

转载 作者:行者123 更新时间:2023-12-04 04:58:47 25 4
gpt4 key购买 nike

我有一个包含两个项目的 Visual Studio 2017 解决方案:

Foo.csproj
Foo.Core.csproj

这两个项目都针对多个框架: net452;netstandard1.2
Foo.csproj 包含对 Foo.Core.csproj 的项目引用:
<ItemGroup>
<ProjectReference Include="..\Foo.Core\Foo.Core.csproj" />
</ItemGroup>

当我为 Foo.csproj 生成 NuGet 包时,我希望 nupkg 文件包含这两个程序集。

当前发生的是,创建的 NuGet 包具有 Foo.dll,然后是对 Foo.Core(不存在)的 NuGet 依赖。

如何使用 msbuild 生成单个 NuGet 包这将包括两个程序集?

作为引用,这是我目前正在使用的命令(这不是我想要的):
msbuild /p:restore,pack Foo.csproj

最佳答案

目前,NuGet 不直接支持开箱即用。您可以关注 this GitHub issue更新。

但是,有几种方法可以创建此类 NuGet 包。

  • 使用“Nugetizer 3000”

  • 这是一个新开发的工具,用于从项目构建 NuGet 包,并通过安装 NuGet.Build.Packaging 工作。 nuget 包。你可以在它的 GitHub wiki 页面上找到一些关于它的文档,但由于它是一个非常新的项目,还没有太多的文档或社区知识(!)(但开发它的团队非常有帮助,你可以提交 GitHub如果你卡住了问题)。
  • 在项目中添加自定义目标(2.0.0 工具/VS 2017 15.3+):在 csproj 中创建一个项目,该项目将包含引用项目的输出 DLL

  • 这种方法非常笨拙,因为它依赖于包目标使用的内部 MSBuild 项目。它的工作原理是首先标记 <ProjectReference>不会像这样从创建的 nuget 包中引用:
    <ProjectReference Include="..\libA\libA.csproj" PrivateAssets="All"/>

    然后您可以将其添加到项目中以包含生成的 libA.dll在 nuget 包中:
    <PropertyGroup>
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);IncludeP2PAssets</TargetsForTfmSpecificBuildOutput>
    </PropertyGroup>
    <Target Name="IncludeP2PAssets">
    <ItemGroup>
    <BuildOutputInPackage Include="$(OutputPath)\testprivatelib.dll" />
    </ItemGroup>
    </Target>

    请注意,这需要您添加所有 <PackageReference>引用项目的项目到您生成包的项目,因为它们将从生成的包中丢失,因为您有效地禁用了传递引用行为。
  • 创建自定义 .nuspec文件

  • 在撰写本文时,这可能是最“受支持”的方式,但也是最复杂的。 NuGet 允许您禁用结果 .nuspec 的自动生成文件和自动收集文件通过设置 <NuspecFile>您项目中的属性,以及 <NuspecProperties>允许您传递替换标记以解析 .nuspec 的属性文件。

    这通过像这样修改项目文件来工作:
    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
    <NuspecFile>$(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec</NuspecFile>
    </PropertyGroup>
    <ItemGroup>
    <ProjectReference Include="..\LibB\LibB.csproj" />
    </ItemGroup>

    <Target Name="SetNuspecProperties" BeforeTargets="GenerateNuspec">
    <PropertyGroup>
    <NuspecProperties>$(NuspecProperties);id=$(AssemblyName)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);config=$(Configuration)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);version=$(PackageVersion)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);description=$(Description)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);authors=$(Authors)</NuspecProperties>
    </PropertyGroup>
    </Target>
    </Project>

    这将自动查找 .nuspec与项目同名的文件 ( somelib.csproj => somelib.nuspec ) 并将一些属性传递给它。这些属性是在目标中创建的,以便能够访问完全解析和默认的属性,例如 PackageVersion .
    .nuspec文件可能如下所示:
    <?xml version="1.0" encoding="utf-8"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
    <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <authors>$authors$</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <dependencies>
    <group targetFramework=".NETStandard1.4">
    <dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
    </group>
    </dependencies>
    </metadata>
    <files>
    <file src="bin\$config$\netstandard1.4\*.dll" target="lib\netstandard1.4\" />
    </files>
    </package>

    请注意,您必须将所有引用的 NuGet 包添加为 <dependency> .nuspec 中的元素文件,因为这些不再从 <PackageReference> 自动生成项目文件中的项目。引用 NuSpec Reference更多细节。

    我最近创建了一个 example project on GitHub demonstrating the use of a custom .nuspec file正是为了这个目的。

    关于在单个 NuGet 包中 MSBuild 多个 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976879/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com