本文主要是介绍加入Plastic SCM后Newtonsoft.Json.dll出现问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
加入Plastic SCM后Newtonsoft.Json.dll出现问题
前阵子自己新开了个人项目,由于是新项目,所以想什么东西都用最新的。所以,版本控制这块我使用了Unity官方推出的Plastic SCM。
一开始安装这个插件了,没啥毛病,使用起来也还算OK。但是随着项目代码越堆越多,嗯,问题出现了。
由于我使用到了强大的 Newtonsoft.json库。把它加入工程后,前几天用着没啥毛病,能正常使用,但后来我在编辑器部分的代码里使用到了这个库时,引用了Newtonsoft.json命名空间,发现问题出来了,Unity一直报错:
工程里Newtonsoft.json存在了倆。这让我莫名其妙了,定位之下,发现Plastic SCM 这个包里也有个Newtonsoft.json库:
好家伙!你还给人家改了个名字,#¥%@#¥,好歹你也改下命名空间呀……你这还藏了个大惊喜!好吧,那我认了,谁叫我用你的东西咧
既然你是铁了心用的了,那我就想想怎么解决咯。由于之前我在非编辑器代码里没问题,可能是因为SCM包里的Json库本身就仅Editor模式运行,而我们写的编辑器部分代码,在引用时,便引用了SCM包里的这个库了……无语……
目前我的解决方案:
方案1:
删除原有的库,拷贝Plastic SCM里的到工程,以保持两个dll的版本一致:
1、删除工程里我们自己引用的Json库
2、右键找到Plastic SCM里的Json库的物理路径:
3、找到它并复制它到我们工程的Plugins目录下,并修改其名字为:Newtonsoft.Json.dll
4、再进入工程,等待编译完成即可
方案2:
不删除自己放到工程里的json库,保留它和Plastic SCM共存,但对代码文件的物理路径的存放位置有要求,因为要用到.asmdef。
1、整理好我们编辑器部分的代码,在代码的相对根目录下,创建一个asmdef文件(程序集定义文件):
例如我的项目里,我在做一个关卡编辑器,所以我把关卡编辑器的代码都整理到了一个LevelMaker/Scripts目录下,然后在LevelMaker目录下右键创建了asmdef:
关于整理代码这块,如果你前期在目录规划上做的好的话,这个应该没什么问题。至于一个asmdef文件囊括多少代码,这个看项目情况,有的项目细粒度会大点。而关于编辑器部分的代码,我一般都会喜欢按每个工具来做划分。
2、创建.asmdef文件后,Unity会把我们编辑器代码括起来,最终编译成一个独立的dll。在这里要勾选.asmdef的设置里的Override Reference选项,会出现Assembly References设置项:
3、点积+号增加一个引用,选择我们需要指定引用的dll文件,Apply之后等待编译即可
4、最后别忘了勾选下设置里的平台选项,不然在发布时编译会出现问题……
方案3:
这个方法不推荐,因为我也没用过。只是想到的……
把Plastic SCM单独拷出来,不受PackagesManager维护,放到Plugins目录下,我们就可以对其为所欲为了……比如把它所引用到的Json库替换成我们自己的……嗯,这个听起来和方案1有点像……事实上unity对它所引用的json库也做了修改的……
我不推荐吧,毕竟PackagesManager维护挺香的,有什么版本迭代也能尽快更新到……毕竟,Plastic SCM也仅仅是个工具而已……
方案4:
找到 Json 库源码,改改之后,自己编译自己的 Json 库……嗯……
Newtonsoft.Json库源码:https://github.com/JamesNK/Newtonsoft.Json
这篇关于加入Plastic SCM后Newtonsoft.Json.dll出现问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!