我正在使用dotnet pack命令为以下场景创建 NuGet 包:
项目结构:
Project B
|----> Project A
Project A
|----> SomePackage
Run Code Online (Sandbox Code Playgroud)
我想创建一个包含ProjectB.dll、ProjectA.dll和SomePackage作为 NuGet 包依赖项的 NuGet 包。
为了包含为 NuGet 包(而不是包依赖项)的一部分,我使用了此处ProjectA.dll建议的以下解决方案。
在ProjectB.csproj:
<ProjectReference Include="ProjectA.csproj" PrivateAssets="all"/>
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
<ItemGroup>
<!-- Filter out unnecessary files -->
<_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
</ItemGroup>
<!-- Print batches for debug purposes -->
<Message Text="Batch for .nupkg: ReferenceCopyLocalPaths = @(_ReferenceCopyLocalPaths), ReferenceCopyLocalPaths.DestinationSubDirectory = %(_ReferenceCopyLocalPaths.DestinationSubDirectory) Filename = %(_ReferenceCopyLocalPaths.Filename) Extension = %(_ReferenceCopyLocalPaths.Extension)" …Run Code Online (Sandbox Code Playgroud) 如果我使用命令行像这样运行 msbuild:msbuild myproject.dproj /t:Clean;Build /p:Config=Release /p:Platform=Win32有没有办法让命令行获取该命令的实际 exe 所在位置的值?
我有一个引用用户控件库的 .NET 5 WPF 应用程序 (x64)。当我直接引用库时,一切正常。
但是,当我创建 Nuget 包,然后在构建服务器上构建引用 Nuget 包的应用程序时,我得到:
NU1202:MyControls 包与 net50-windows (.NETFramework、Version=v5.0、Profile=windows)/win-x64 不兼容。
MyControls 包支持:
- net50-windows7.0(.NETFramework,版本=v5.0,配置文件=windows7.0)
- netcoreapp3.1(.NETCoreApp,版本=v3.1)
MyControls .csproj 文件包含以下内容:
<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;net5.0-windows</TargetFrameworks>
<UseWPF>true</UseWPF>
<RuntimeIdentifiers>win;win-x64</RuntimeIdentifiers>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
应用程序 .csproj 文件包含以下内容:
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<RuntimeIdentifiers>win-x64</RuntimeIdentifiers>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它会输出 Windows 7 的包。我发现这个链接描述了它: https: //github.com/dotnet/sdk/issues/14553 那里的评论之一似乎与我的情况相符:
我也遇到了同样的现象,当我尝试在 .NET 5 应用程序中安装这些包时,它告诉我“net5.0”和“net.5.0-windows7.0”不兼容。不过,我所有的项目实际上都是“net5.0-windows”。
如果我手动将 net5.0-windows7.0 文件夹复制到 .nuget/packages 下的新文件夹 net5.0-windows,Nuget 错误就会消失。
但我得到了这个编译错误:
错误CS0103:名称“Windows”在当前上下文中不存在
我应该更改什么才能使 Nuget 恢复正常工作?
是否可以根据 .NET 5 SDK msbuild 为 .NET 4.x 创建的项目,而无需在 VS 中升级该项目?
我有一个 .NET 4.7 库项目,我使用 msbuild 为 .NET 4.x 编译(并且通过为 .NET 4.7 创建“类库(.NET Framework)”项目可以轻松重现此问题)。
我想为 .NET 5 构建它,所以我尝试了
dotnet msbuild /property:TargetFrameworkVersion=net5.0 /property:TargetFrameworkIdentifier=.NETCoreApp
Microsoft (R) Build Engine version 16.8.0+126527ff1 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
C:\Program Files\dotnet\sdk\5.0.100\Roslyn\Microsoft.CSharp.Core.targets(8,31): error MSB4086: A numeric comparison was attempted on "$(_TargetFrameworkVersionWithoutV)" that evaluates to "" instead of a number, in condition "('$(TargetFrameworkIdentifier)' != '.NETCoreApp' OR '$(_TargetFrameworkVersionWithoutV)' < '3.0') AND [H:\ClassLibrary1\ClassLibrary1.csproj]
C:\Program Files\dotnet\sdk\5.0.100\Roslyn\Microsoft.CSharp.Core.targets(8,31): error …Run Code Online (Sandbox Code Playgroud)