Unity 中的 NuGet 包
Posted
技术标签:
【中文标题】Unity 中的 NuGet 包【英文标题】:NuGet packages in Unity 【发布时间】:2018-11-23 13:27:35 【问题描述】:我想在 Unity 中使用一些 NuGet 包。我实现了Unity根据这篇文章(https://www.what-could-possibly-go-wrong.com/unity-and-nuget/)找到下载的DLL。 nuget.config 文件可以配置为将包下载到 Assets 文件夹内的 Plugins 文件夹中。问题是 NuGet 会下载每个 DLL 的多个版本(例如 net46、netcore50、netstandard21 等),而 Unity 不喜欢具有相同名称的多个 DLL。我知道我可以简单地将 DLL 手动放入 Plugins 文件夹中,但不幸的是,这不是一个让我满意的解决方案。
您知道我该如何解决这个问题吗?是否可以将 NuGet 配置为只为每个依赖项下载一个 DLL?
【问题讨论】:
您的文章谈到了问题和解决问题的方法。作者使用单独的 Visual Studio 项目来解决此问题。 查看 MS 文档 docs.microsoft.com/en-us/visualstudio/cross-platform/… 【参考方案1】:只是想我会添加这个以防它帮助任何人
我使用Nuget for Unity 资产(免费)来导入一个包(websocketsharp),它真的很容易和无痛。 VS 中的引用也立即生效
您尝试导入的包自然必须与 Unity 兼容,但即使您手动导入也是如此。所以我建议尝试一下
【讨论】:
怎么知道包是否兼容unity? 通常在包自述文件中说它与 Unity 兼容。如果没有,那么最好的找出方法是尝试导入它并查看 Unity 报告任何兼容性错误。 this post 中有一些更有用的信息 包管理器对该包抛出各种错误。 @BrainSlugs83 在 repo 中提交问题可能是个好主意【参考方案2】:这里are the details,
1. go to your desired NuGet package webpage.
2. on the right side **Download Package** option click it.
3. your package **.nupkg** file will be downloaded.
4. change its extension to .zip and extract it
5. go to lib and copy your package dll file from net or any netstandard folder. For [your unity project compatibility purposes][2] view this:
6. open unity workspace and create plugin folder
7. paste your dll file here.
这里是 video 指南,我已经统一导入了 newtonsoft.json 包
【讨论】:
但是如果您有两个同名的 .dll 文件怎么办?一个 dll 用于 x64,另一个用于 x86 @Muhammad Fauzan Khan 你应该在插件文件夹 x86 和 x64 中创建两个文件夹并放置你的 dll 文件 作为记录,根据这个答案,您应该创建MyUnityProject/Assets/Plugins
并将您的.dll
文件放在那里【参考方案3】:
您真的不想走上将 Unity 配置为自动使用 Nuget 的道路。那篇文章比较老了。使用 Unity 2018,您可以获得 .net 标准 2.0 兼容级别,这对于 Nuget 包来说应该是完美的。只需使用单独的 VS 项目(如文章中所述)下载包,然后获取 netstandard20 版本的 DLL 并将其放入您的 Unity 项目中。
【讨论】:
最有可能的是,如果该库是在考虑其他平台的情况下实现的。 JSON.Net(甚至是 dotnet 标准版本)在 AOT 平台上尤其存在问题,至少在 Unity 内部是这样。 我刚刚在一个 IL2CPP 项目中使用了 Json.NET,它运行良好。 对于在 EditMode 测试中使用 FluentAssertions:将 netstandard20 DLL 放到 Plugins 文件夹中,然后打开 EditMode 程序集定义并添加 FluentAssertions.dll 的程序集参考。 (可能需要重新启动一些 Unity)。然后在您的测试 .cs 文件中,添加“使用 FluentAssertions;”你应该很好。 你救了我的命。非常感谢@Arshia001【参考方案4】:使用本机 Nuget(适用于仅针对一个框架的包)
您可以创建一个nuget.config
和一个packages.nuget
文件并将它们放在项目的根目录中,而不是手动下载所有内容。
nuget.config
:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<!-- This makes Nuget to place the packages at ./Assets/Plugins -->
<add key="repositoryPath" value="./Assets/Plugins" />
</config>
<packageSources>
<clear /> <!-- Delete packageSources from other nuget.configs -->
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
</packageSources>
</configuration>
packages.nuget
:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<!-- targetFramework="netstandard2.0" makes nuget to unzip the netstandard2.0 version of the package-->
<package id="PackageA" version="1.0.0" targetFramework="netstandard2.0" />
<package id="PackageADependsOnThis" version="1.0.0" targetFramework="netstandard2.0" />
<package id="PackageB" version="1.0.0" targetFramework="netstandard2.0" />
</packages>
用法
要恢复这些包,请在终端中打开项目的根目录并输入以下内容:
nuget restore -NoCache
您可能希望省略 -NoCache
,它会阻止 nuget 使用 C:\Users\<username>\.nuget\packages
处的缓存。如果您使用私有 nuget 提要,并且缓存中已有包符合您所需的包名称和版本但来自不同的提要,这将非常有用。
这种方法的缺点是您将同时拥有./Assets/Plugins
netstandard2.0-Library 和 Nuget 包,如下所示:
Nuget 包通常不是那么大,所以这不应该是一个因素。
另请注意,这种方法不会解决包依赖关系,您必须自己在packages.config
中列出它们。
编辑:我注意到另一个缺点:也将安装针对多个框架的 NugetPackages。这会导致 Unity-Error,需要自己删除这些框架安装。
另见
nuget.config reference
【讨论】:
【参考方案5】:您必须在包文件夹/插件中手动设置下载的 nuget /is。 Nuget 不知道哪个插件可以使用 unity 以及如何使用。你可以在inspector中设置它们的参数:editor,standalone ... x86,x64 ...
【讨论】:
【参考方案6】:NuGet2Unity 允许将任何 Nuget 包转换为“.unitypackage”。 我用它来转换“SpecFlow”,并且能够导入生成的 Unity 包。 查看他们的Examples。
它对我有用:
dotnet.exe run -n specflow --version 3.0.225
请注意,您可能需要跳过由 NugetPackage 提供的依赖项,这些依赖项已经由 unity 本身提供。
【讨论】:
NuGet2Unity 链接已损坏。以上是关于Unity 中的 NuGet 包的主要内容,如果未能解决你的问题,请参考以下文章