自己发布包中build文件夹的文件不被第三方项目消费
Files of build folder in self-published package not consumed by third-party projects
发布仅包含构建实用程序的包时出现问题。准确地说:我遵循了 nuget guideline 哪些文件必须在哪里。因此,我创建了一个简单的 [project][2],其中我只想在第三方项目的构建文件夹中部署 .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-propertiesbab4543af344c95ae6210e86f61f55a.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
将不包含它应该包含的 .props
和 .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>
所以它应该包括构建资产。我认为这与受支持的框架有关,因为每个框架/"framework" 都应该支持此包,例如 netcore
、netcoreapp
、net
、netstandard
,等等。
应该说,在创建包时,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.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.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
文件不会被 nuget 目标占用中间创建 obj/project.assets.json
。
经过一段旅程后,我找到了解决方案。所以有两个问题需要解决。
首先是源路径:不要使用任何 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 ..
没有完全 "install" 它,它不会将 .nupkg 文件的资产(build、buildMultiTargeting、lib、..)解压缩到其相应文件夹中(<local-nuget-source-folder>/<package-id>/<package-version>/
).因此 .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 文件)它也会默认尝试打包符号,但是当打包确实错误取消时,它不会告诉你,而是让你烦恼C:\Program Files\dotnet\sdk.1.100\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(198,5): error NU5017: Cannot create a package that has no dependencies nor content.
,但 .nupkg(不是 .snupkg)已经创建。因此,您必须指定 <IncludeSymbols>false</IncludeSymbols>
才能完成未取消的构建。
所以对于一个完全只有构建文件的包,你会有一个这样的 .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
文件。
干杯。
发布仅包含构建实用程序的包时出现问题。准确地说:我遵循了 nuget guideline 哪些文件必须在哪里。因此,我创建了一个简单的 [project][2],其中我只想在第三方项目的构建文件夹中部署 .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-propertiesbab4543af344c95ae6210e86f61f55a.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
将不包含它应该包含的 .props
和 .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>
所以它应该包括构建资产。我认为这与受支持的框架有关,因为每个框架/"framework" 都应该支持此包,例如 netcore
、netcoreapp
、net
、netstandard
,等等。
应该说,在创建包时,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.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.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
文件不会被 nuget 目标占用中间创建 obj/project.assets.json
。
经过一段旅程后,我找到了解决方案。所以有两个问题需要解决。
首先是源路径:不要使用任何 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 ..
没有完全 "install" 它,它不会将 .nupkg 文件的资产(build、buildMultiTargeting、lib、..)解压缩到其相应文件夹中(<local-nuget-source-folder>/<package-id>/<package-version>/
).因此 .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 文件)它也会默认尝试打包符号,但是当打包确实错误取消时,它不会告诉你,而是让你烦恼C:\Program Files\dotnet\sdk.1.100\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(198,5): error NU5017: Cannot create a package that has no dependencies nor content.
,但 .nupkg(不是 .snupkg)已经创建。因此,您必须指定 <IncludeSymbols>false</IncludeSymbols>
才能完成未取消的构建。
所以对于一个完全只有构建文件的包,你会有一个这样的 .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
文件。
干杯。