Dotnet build 和 dotnet pack 生成不同的 nupkg

2024-03-20

这与这个问题 https://stackoverflow.com/questions/76467763/cant-use-analyzer-in-nuget-package-an-instance-of-analyzer-cannot-be-created.

我有一个打包的源生成器,它需要将 YamlDotNet 捆绑为分析器的私有资产。为了实现这一目标,我有这个 csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net7.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <LangVersion>default</LangVersion>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <Version>0.0.1-alpha</Version>
        <Title>SuperFluid</Title>
        <Description>An incremental source generator for fluent APIs with grammar</Description>
        <PackageProjectUrl>https://github.com/hughesjs/SuperFluid</PackageProjectUrl>
        <PackageLicenseUrl>https://github.com/hughesjs/SuperFluid/blob/master/LICENSE</PackageLicenseUrl>
        <RepositoryUrl>https://github.com/hughesjs/SuperFluid.git</RepositoryUrl>
        <RepositoryType>git</RepositoryType>
        <PackageReadmeFile>./README.md</PackageReadmeFile>
        <IncludeBuildOutput>false</IncludeBuildOutput>
        <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
    </PropertyGroup>

    <ItemGroup>
        <None Include="../../README.md" Pack="true" PackagePath="\" />
    </ItemGroup>

    <ItemGroup>
        <InternalsVisibleTo Include="SuperFluid.Tests" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.4.0" PrivateAssets="all" />
        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
        <PackageReference Include="YamlDotNet" Version="13.1.0" PrivateAssets="all" GeneratePathProperty="true" />
    </ItemGroup>
    
    <!-- Gross hack to let source generator use nuget packages -->
    <PropertyGroup>
        <GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
    </PropertyGroup>
    
    <Target Name="GetDependencyTargetPaths" AfterTargets="ResolvePackageDependenciesForBuild">
            <ItemGroup>
                <TargetPathWithTargetPlatformMoniker Include="@(ResolvedCompileFileDefinitions)" IncludeRuntimeDependency="false" />
                <None Include="@(ResolvedCompileFileDefinitions)" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
            </ItemGroup>
    </Target>
    <!-- End Hack -->
    
    
    <ItemGroup>
        <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>
</Project>

现在,如果我只是用以下命令构建项目dotnet pack -c Release似乎我期望包含的所有内容都是:

❯ unzip -l SuperFluid.0.0.1-alpha.nupkg                                                                                                   ─╯
Archive:  SuperFluid.0.0.1-alpha.nupkg
  Length      Date    Time    Name
---------  ---------- -----   ----
      500  2023-06-25 19:03   _rels/.rels
      720  2023-06-25 19:03   SuperFluid.nuspec
     1290  2023-06-04 19:59   README.md
    26112  2023-06-25 17:57   analyzers/dotnet/cs/SuperFluid.dll
  2828968  2022-11-12 03:59   analyzers/dotnet/cs/Microsoft.CodeAnalysis.dll
  6145664  2022-11-12 04:10   analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.dll
   190592  2021-10-22 23:39   analyzers/dotnet/cs/System.Collections.Immutable.dll
   462720  2020-10-19 18:45   analyzers/dotnet/cs/System.Reflection.Metadata.dll
    18024  2021-10-22 23:38   analyzers/dotnet/cs/System.Runtime.CompilerServices.Unsafe.dll
   756864  2021-10-22 23:46   analyzers/dotnet/cs/System.Text.Encoding.CodePages.dll
   265728  2023-04-16 20:31   analyzers/dotnet/cs/YamlDotNet.dll
      520  2023-06-25 19:03   [Content_Types].xml
      670  2023-06-25 19:03   package/services/metadata/core-properties/1567cf9005dc47bcab15315a2e2084cf.psmdcp
---------                     -------
 10698372                     13 files

但是,如果我构建并打包dotnet build -c Release && dotnet pack -c Release -p:PackageVersion=0.0.2我发现这些dll已被删除:

❯ unzip -l SuperFluid.0.0.2.nupkg                                                                                                         ─╯
Archive:  SuperFluid.0.0.2.nupkg
  Length      Date    Time    Name
---------  ---------- -----   ----
      500  2023-06-25 19:05   _rels/.rels
      714  2023-06-25 19:05   SuperFluid.nuspec
     1290  2023-06-04 19:59   README.md
    26112  2023-06-25 17:57   analyzers/dotnet/cs/SuperFluid.dll
      520  2023-06-25 19:05   [Content_Types].xml
      664  2023-06-25 19:05   package/services/metadata/core-properties/49ced3920e7d47ff9d9c3ab4a107dc77.psmdcp
---------                     -------
    29800                     6 files

现在,由于上述链接问题的答案,我至少知道这种情况正在发生,并且我可以通过依赖来解决它GeneratePackageOnBuild但我真正的问题是:

  1. 为什么这会生成两个不同的包?
  2. 我怎样才能使dotnet pack包括私人资产吗?

(是的,我知道源生成器技术上应该以 netstandard 2.0 为目标,但那是另一回事,我有理由忽略它)


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dotnet build 和 dotnet pack 生成不同的 nupkg 的相关文章

随机推荐