【问题标题】:Files of build folder in self-published package not consumed by third-party projects第三方项目未使用的自发布包中的build文件夹文件
【发布时间】:2020-04-29 00:12:03
【问题描述】:

仅使用构建实用程序发布包时遇到问题。准确地说:我遵循nuget guideline 哪些文件必须在哪里。所以我创建了一个简单的 [project][2],我只想在 build 文件夹中为第三方项目部署 .props.targets 文件。当我用dotnet pack Teronis.Packaging.ProjectBuildInPackage.csproj --configuration Release) 打包时,.nupkg 文件确实包含所有必要的文件:

Listing archive: bin\Release\Teronis.Packaging.ProjectBuildInPackage.1.0.0.nupkg

--
Path = bin\Release\Teronis.Packaging.ProjectBuildInPackage.1.0.0.nupkg
Type = zip
Physical Size = 3027

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2020-01-11 18:13:12 .....          533          297  _rels\.rels
2020-01-11 18:13:12 .....          696          358  Teronis.Packaging.ProjectBuildInPackage.nuspec
2020-01-11 17:03:22 .....          435          208  build\Teronis.Packaging.ProjectBuildInPackage.props
2020-01-11 11:28:08 .....         1188          532  build\Teronis.Packaging.ProjectBuildInPackage.targets
2020-01-11 18:13:12 .....          534          219  [Content_Types].xml
2020-01-11 18:13:12 .....          735          413  package\services\metadata\core-properties\3bab4543af344c95ae6210e86f61f55a.psmdcp
------------------- ----- ------------ ------------  ------------------------
2020-01-11 18:13:12               4121         2027  6 files

当我将此包 (nuget add bin/Release/Teronis.Packaging.ProjectBuildInPackage.1.0.0.nupkg -Source "C:\Users\<user>\.nuget\packages") 添加到我的本地提要时,当然在我删除它之后,并让具有自定义提要源的示例项目包含该特定包,生成的 obj/project.assets.json 将不包含 @ 987654328@ 和 .targets 文件应该:

{
  "version": 3,
  "targets": {
    ".NETStandard,Version=v2.0": {
      "Microsoft.NETCore.Platforms/1.1.0": {
        ...
      },
      "NETStandard.Library/2.0.3": {
        ...
      },
      // ###############################################
      "Teronis.Packaging.ProjectBuildInPackage/1.0.0": {
        "type": "package"
        // Here should the .props and .targets files be referenced
      },
      "Test.Localization/1.0.0": {
        ...
      }
    }
  },
  "libraries": {
    "Microsoft.NETCore.Platforms/1.1.0": {
      ...
    },
    "NETStandard.Library/2.0.3": {
      ...
    },
    // ###############################################
    "Teronis.Packaging.ProjectBuildInPackage/1.0.0": {
      "sha512": "vKfduDW8+hIYQ1s6zFO0EnCmJTSVGAzsvcDDM2YIEiIqksGX1WO/ERMvAkXmJR2Q0x92wFk+z0i448HuYmUWSQ==",
      "type": "package",
      "path": "teronis.packaging.projectbuildinpackage/1.0.0",
      "files": [
        ".nupkg.metadata",
        // Here are the .props and .targets files missing
        "teronis.packaging.projectbuildinpackage.1.0.0.nupkg.sha512",
        "teronis.packaging.projectbuildinpackage.nuspec"
      ]
    },
    "Test.Localization/1.0.0": {
      "type": "project",
      "path": "../../Teronis.DotNet/src/Packaging/ProjectBuildInPackage/test/Test.Localization/Test.Localization.csproj",
      "msbuildProject": "../../Teronis.DotNet/src/Packaging/ProjectBuildInPackage/test/Test.Localization/Test.Localization.csproj"
    }
  },
  "projectFileDependencyGroups": {
    ...
  },
  "packageFolders": {
    "C:\\Users\\<user>\\.nuget\\packages\\": {},
    "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder": {}
  },
  "project": {
    "version": "2.0.0",
    "restore": {
      "projectUniqueName": "C:\\Users\\<user>\\source\\repos\\Teronis.Packaging.ProjectBuildInPackage.Test\\Teronis.Packaging.ProjectBuildInPackage.Test\\Teronis.Packaging.ProjectBuildInPackage.Test.csproj",
      "projectName": "Teronis.Packaging.ProjectBuildInPackage.Test",
      "projectPath": "C:\\Users\\<user>\\source\\repos\\Teronis.Packaging.ProjectBuildInPackage.Test\\Teronis.Packaging.ProjectBuildInPackage.Test\\Teronis.Packaging.ProjectBuildInPackage.Test.csproj",
      "packagesPath": "C:\\Users\\<user>\\.nuget\\packages\\",
      "outputPath": "C:\\Users\\<user>\\source\\repos\\Teronis.Packaging.ProjectBuildInPackage.Test\\Teronis.Packaging.ProjectBuildInPackage.Test\\obj\\",
      "projectStyle": "PackageReference",
      "fallbackFolders": [
        "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
      ],
      "configFilePaths": [
        "C:\\Users\\<user>\\source\\repos\\Teronis.Packaging.ProjectBuildInPackage.Test\\NuGet.Config",
        "C:\\Users\\<user>\\AppData\\Roaming\\NuGet\\NuGet.Config",
        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
      ],
      "originalTargetFrameworks": [
        "netstandard2.0"
      ],
      "sources": {
        "C:\\Users\\<user>\\.nuget\\packages": {},
        "https://api.nuget.org/v3/index.json": {}
      },
      "frameworks": {
        "netstandard2.0": {
          "projectReferences": {
            "C:\\Users\\<user>\\source\\repos\\Teronis.DotNet\\src\\Packaging\\ProjectBuildInPackage\\test\\Test.Localization\\Test.Localization.csproj": {
              "projectPath": "C:\\Users\\<user>\\source\\repos\\Teronis.DotNet\\src\\Packaging\\ProjectBuildInPackage\\test\\Test.Localization\\Test.Localization.csproj"
            }
          }
        }
      },
      "warningProperties": {
        "warnAsError": [
          "NU1605"
        ]
      }
    },
    "frameworks": {
      "netstandard2.0": {
        "dependencies": {
          "NETStandard.Library": {
            "suppressParent": "All",
            "target": "Package",
            "version": "[2.0.3, )",
            "autoReferenced": true
          },
          "Teronis.Packaging.ProjectBuildInPackage": {
            "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
            "suppressParent": "All",
            "target": "Package",
            "version": "[1.0.0, )"
          }
        },
        "imports": [
          "net461",
          "net462",
          "net47",
          "net471",
          "net472",
          "net48"
        ],
        "assetTargetFallback": true,
        "warn": true,
        "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.100\\RuntimeIdentifierGraph.json"
      }
    }
  }
}

示例项目中的包被引用为

  <ItemGroup>
    <PackageReference Include="Teronis.Packaging.ProjectBuildInPackage" Version="1.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

所以它应该包括构建资产。我认为这与支持的框架有关,因为每个框架/“框架”都应该支持这个包,例如 netcorenetcoreappnetnetstandard 等等。

应该说,在创建包时,nuget 分析器确实会抱怨

1>------ Build started: Project: Teronis.Packaging.ProjectBuildInPackage, Configuration: Release Any CPU ------
1>Teronis.Packaging.ProjectBuildInPackage -> C:\Users\<user>\source\repos\Teronis.Packaging.ProjectBuildInPackage\Teronis.Packaging.ProjectBuildInPackage\bin\Release\netstandard2.0\Teronis.Packaging.ProjectBuildInPackage.dll
1>Successfully created package 'C:\Users\<user>\source\repos\Teronis.Packaging.ProjectBuildInPackage\Teronis.Packaging.ProjectBuildInPackage\bin\Release\Teronis.Packaging.ProjectBuildInPackage.1.0.0.nupkg'.
1>C:\Program Files\dotnet\sdk\3.1.100\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(198,5): warning NU5128: Some target frameworks declared in the dependencies group of the nuspec and the lib/ref folder do not have exact matches in the other location. Consult the list of actions below:
1>C:\Program Files\dotnet\sdk\3.1.100\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(198,5): warning NU5128: - Add lib or ref assemblies for the netstandard2.0 target framework
1>Done building project "Teronis.Packaging.ProjectBuildInPackage.csproj".
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

即使我知道如何通过创建 lib/netstandard2.0/_._ 来解决它,它也不能解决我的问题,.props.targets 文件不会被中间创建 obj/project.assets.json 的 nuget 目标占用。

【问题讨论】:

    标签: c# .net visual-studio msbuild nuget


    【解决方案1】:

    经过一小段旅程后,我找到了解决方案。所以有两个问题需要解决。

    首先是源路径:不要使用任何 nuget 缓存作为提要源。给我(nuget locals all -list):

    http-cache: C:\Users\<user>\AppData\Local\NuGet\v3-cache
    global-packages: C:\Users\<user>\.nuget\packages\
    temp: C:\cygwin64\tmp\NuGetScratch
    plugins-cache: C:\Users\<user>\AppData\Local\NuGet\plugins-cache
    

    命令nuget add .. 不会完全“安装”它,它不会将 .nupkg 文件的资产(build、buildMultiTargeting、lib、..)解压缩到其相应文件夹 (&lt;local-nuget-source-folder&gt;/&lt;package-id&gt;/&lt;package-version&gt;/) 中。所以安装它们的项目不会包含.props.targets 文件。但是,当您指定另一个源位置,将包添加到该位置,然后将其安装到项目中时,该包将与其解压缩的资产一起缓存,并且项目会将它们包含在 obj\project.assets.json 中,是的。

    第二个问题属于 nuget 分析器的抱怨。因此,如果我将 .csproj 转换为 .nuspec,看起来像

    <?xml version="1.0" encoding="utf-8"?>
    <package >
      <metadata>
        <id>Teronis.Packaging.ProjectBuildInPackage</id>
        <version>1.0.0</version>
        <title>*not in use*</title>
        <authors>*not in use*</authors>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <summary>*not in use*</summary>
        <description>*not in use*</description>
        <copyright>*not in use*</copyright>
        <tags>*not in use*</tags>
        <developmentDependency>true</developmentDependency>
      </metadata>
      <files>
        <file src="build\*" target="build" />
        <file src="buildMultiTargeting\*" target="buildMultiTargeting" />
      </files>
    </package>
    

    在使用nuget pack 打包时,它不会抱怨任何事情。为什么呢?当使用 dotnet pack 打包时(我们使用它是因为 .csproj 文件),它也会默认尝试打包符号,但是当打包错误取消时,它不会告诉你,而是用 @987654333 惹恼你@,但 .nupkg(不是 .snupkg)已经创建。因此,您必须指定 &lt;IncludeSymbols&gt;false&lt;/IncludeSymbols&gt; 才能完成未取消的构建。

    因此,对于完全仅构建文件的包,您将拥有这样的 .csproj 文件:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
      <PropertyGroup>
        <Description>Allows project reference content to be added to the packing parent nuget package.</Description>
    
        <!-- We don't build a executable package. 
             We build an only-build-time package. -->
        <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
        <DevelopmentDependency>true</DevelopmentDependency>
        <IncludeBuildOutput>false</IncludeBuildOutput>
        <IncludeSymbols>false</IncludeSymbols>
      </PropertyGroup>
    
      <ItemGroup>
        <None Include="build\**" Pack="true" PackagePath="build\" />
        <None Include="buildMultiTargeting\**" Pack="true" PackagePath="buildMultiTargeting\" />
      </ItemGroup>
    
    </Project>
    

    buildMultiTargeting 中的.props.targets 文件只是导入build\ 中的.props.targets 文件。

    干杯。

    【讨论】:

    • 干得好!我想你现在可以accept it 让更多的会员看到这个有用的信息!见this,只是一个提醒:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多