【问题标题】:VS for Mac unable to add .NET Standard NuGetVS for Mac 无法添加 .NET Standard NuGet
【发布时间】:2018-08-15 14:29:45
【问题描述】:

我在 VS for Mac 中遇到了一个奇怪的行为。这就是我复制它的方式:

  1. 使用 VS2017 构建了一个 .NET Standard 2.0 NuGet 包。包名为“MobileApps.Auth 1.0.0”
  2. 将 NuGet 推送到我们公司的 NuGet 服务器
  3. 切换到 Mac 并启动 VS
  4. 在 Mac 上;构建了一个 Xamarin Forms 应用(共享项目也是 .NET Standard 2.0)
  5. 添加了对 .NET Standard 2.0 NuGet 的引用

错误:

Package MobileApps.Auth 1.0.0 is not compatible with netstandard2.0 (.NETStandard,Version=v2.0). Package MobileApps.Auth 1.0.0 supports:
  - monoandroid81 (MonoAndroid,Version=v8.1)
  - xamarinios10 (Xamarin.iOS,Version=v1.0)

对于 NuGet 为何支持monodroid81xamarinios10,我没有任何线索。这是一个引用 Xamarin.Forms 的 .NET Standard 2.0 库。

如果我改为留在 PC 上并在 Visual Studio 2017 中运行第 4 步和第 5 步,一切都很好。

这听起来像是 VS for Mac 中的错误。有没有其他人看过这个?

总的来说,我花了几天时间在 Mac 和 PC 上构建基于 .NET Standard 2.0 的 NuGet 包,我总体感觉这在 Mac 上并不适用。我在 VS2017 上构建 NuGet 的原因是因为在 VS for Mac 上构建的 NuGet 包包含导致 msbuild 由于冲突而失败的各种外观(在多个引用的程序集中找到相同的标识符)。

[编辑 1]

这是在 VS4M 上构建包时的 NuGet 布局:

_rels (empty folder)
[Content_Types].xml
lib
   netstandard2.0
      MobileApps.Auth.dll (my lib)
      (+ 113 other dlls)
MobileApps.Auth.nuspec
package
   services
      metadata
         core-properties
            5bd1f861cd8a425f854c073a4a5f3e0e.psmdcp

这是在 VS2017 上构建时的 NuGet 布局:

_rels
   .rels
[Content_Types].xml
lib
   netstandard2.0
      MobileApps.Auth.dll (my lib)
MobileApps.Auth.nuspec
package
   services
      metadata
         core-properties
            5bd1f861cd8a425f854c073a4a5f3e0e.psmdcp

不同之处在于 VS4M 在 netstandard2.0 文件夹中包含 113 个额外的 dll,而 VS2017 没有。我该如何控制?

[编辑 2]

这是 .nupkg 中的 .nuspec,使用 VS4M 构建:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>MobileApps.Auth</id>
    <version>0.1.1</version>
    <title></title>
    <authors>Jonas Rembratt</authors>
    <owners>Jonas Rembratt</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>bla bla</description>
    <summary></summary>
    <releaseNotes></releaseNotes>
    <copyright></copyright>
    <language></language>
    <dependencies>
      <group targetFramework=".NETStandard2.0">
        <dependency id="Xamarin.Forms" version="3.1.0.697729" />
        <dependency id="System.ValueTuple" version="4.5.0" />
      </group>
    </dependencies>
  </metadata>
</package>

【问题讨论】:

  • 奇怪,我一直在创建 NetStd nugets 并没有在 VS4M 上看到这个问题...... nuget 包的物理布局如何? (即,如果您解压缩 nuget 并手动将 ref 添加到 .dll 中,它在引用的项目中是否可以正常工作?)
  • NuGet 包含了大量的库,据我所知,没有真正的原因。是的,我可以从 NuGet 解压 .dll 并成功引用它,但如果我只是以常规方式添加 NuGet,我会得到大量 CS1703(“已导入具有等效标识的多个程序集:...”)。有没有办法避免 NuGet 塞满不必要的包或解决这些冲突?
  • nuget 中的物理布局是什么?
  • _rels(空文件夹)[Content_Types].xml lib netstandard2.0 MobileApps.Auth.dll(我的 lib)(+ 114 个其他 dll)MobileApps.Auth.nuspec 包服务元数据核心属性 5bd1f861cd8a425f854c073a4a5f3e0e。 psmdcp
  • 这是非常明智的结果。只有当它使用的所有东西都是标准的时,库才能成为.netstandard。 xamarin 表单没有任何标准,这样的库只能在 xamarin 项目中使用。

标签: xamarin.forms nuget .net-standard visual-studio-mac


【解决方案1】:

好的,这是我使用 NuGet/VS4M/VS2017 进行实验的最新结果。一个问题似乎是 VS4M 在 NuGet 包中包含 113 个库,所以我想看看这是否是问题所在。我首先尝试在 Mac 上简单地将 .nupkg 文件重命名为 .nupkg.zip,然后解压缩,然后删除 .nupkg,然后删除 lib/netstandard20 中的 113 个库,只留下我自己的 dll。然后我简单地将文件夹再次压缩到“MobileApps.Auth.nupkg.zip”中,但似乎 Finder 不会友好地删除“.zip”后缀。因此,我只是将 .zip 移至 Windows 并删除了那里的“.zip”后缀,然后再将其移回 MacOS。最后,我留下了一个 .nupkg,它本质上看起来就像我用 VS2017 生成的那个(参见 OP),这是一个只包含我自己的 .dll 文件的包。

这行得通。

那么,现在的问题是:

  1. 这让我不得不在重新生成 NuGet 包时手动从 NuGet 包中手动删除所有不必要的 .dll 文件的繁琐过程。真的没有办法像 VS2017 那样配置“nuget”构建以首先排除这些库吗?
  2. 为什么当我在 VS2017 上构建 .nupkg 文件然后尝试在 VS4M 中将它用于我的项目时,它不起作用?

【讨论】:

  • 您如何使用 VS Mac 和 VS 2017 构建 NuGet 包?
  • 无法重现 1 和 2。我在 VS 2017 中创建了一个新的 .NET Standard 2.0 项目。进入项目选项并启用在构建时生成包(向 csproj 添加了 GeneratePackageOnBuild 属性)。安装了 Xamarin.Forms 和 System.ValueTuple NuGet 包。然后通过构建项目来构建 .nupkg。将其复制到Mac。安装到 VS Mac 中的 .NET Standard 2.0 项目中时不会出现任何错误。同样在 Mac 上构建项目不会将任何其他程序集添加到 NuGet 包的 lib 文件夹中,除了项目的主程序集。
  • 在 VS4M 上,我只需检查“在构建项目时创建 NuGet 包”并填写元数据。我还没有真正找到任何其他选择(有吗?)。在 VS2017 上,我也这样做:勾选“在构建时生成 NuGet 包”并填写所需的元数据。
  • @MattWard 我假设您还添加了 NuGet.Build.Package (NuGetizer-3000)?
  • 不,我没有使用 NuGetizer 3000。我只是使用了 VS 2017 并在构建时启用了生成包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
相关资源
最近更新 更多