寫了一篇:html
ASP.Net Core on Linux (CentOS7) 共享第三方依賴庫部署linux
當第二次想作相同的事,卻趕上了Bug,因而有了第二篇:git
ASP.NET Core 共享第三方依賴庫部署的Bug(*.deps.json on 2.2.0 or 4.6.0 版本)github
就報告到Github上去了,來來回回和人家交涉了幾天:web
截幾個圖,給大夥學習一下英文:json
我以強悍的中英文雙版提交了問題:windows
I try to put the Microsoft..dll and System..dll togather to a new folder.
以便把(第三方或)系統的和應用的dll分開。
以前花了很長的一段時間研究以後:
I find xxx.deps.json can make it work.
以後我還特地寫了篇文章介紹它:http://www.javashuo.com/article/p-phwtjcai-mh.html
but today,when i update the Microsoft. Aspnetcore to 2.2.0 version.
it dose not work, and make me crazy.服務器
because it always show me the msg like this:mvc
F:\Code\OpenSource\Aries-GitHub\trunk\Aries.DevFramework\Web.UI_NetCore\bin\Rele ase\PublishOutput>dotnet Web.UI.dll Error: **An assembly specified in the application dependencies manifest (Web.UI.deps.js on) was not found**: package: 'Microsoft.AspNetCore.Authentication.Abstractions', version: '2.2.0 ' path: 'lib/netstandard2.0/Microsoft.AspNetCore.Authentication.Abstractions.d ll'
and the json like this:app
"Microsoft.AspNetCore.Authentication.Abstractions/2.2.0": { "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "2.2.0", "Microsoft.Extensions.Logging.Abstractions": "2.2.0", "Microsoft.Extensions.Options": "2.2.0" }, "runtime": { "lib/netstandard2.0/Microsoft.AspNetCore.Authentication.Abstractions.dll": { "fileVersion": "2.2.0.18316" } } }
我花了N長的時間在檢測配置和肯定路徑的正確性,但結果,卻依舊很悲催。
it take me much time to find out the question what it's.
when i try to maike it like this:
Microsoft.AspNetCore.Authentication.Abstractions
Microsoft.AspNetCore.Authentication.Abstractions/2.2.xxx
it work.
就是這樣,只要版本號不是2.2.0,它就一切正常。
以後又幾回測試,發現版本號是4.6.0也一樣有問題。
and then i find the version on /4.6.0 ,it does not work also.
就是這樣,版本號三位數,尾數是0的,就提示找不到dll。
how ugly this bug it's.
中英文雙語版彙報以後,老外回消息了,它估計看到中文就頭大:
我看了半天,也是一臉頭大,因而,我努力再描述一下問題,並打算用截圖說明問題:
ok,i try it again.
一、I have a mvc website:http://mvc.taurus.cyqdata.com, it run on CentOS7,at first it deploy like this :
and now it make it like this by *.deps.json:
I put the Microsoft.xxx.dll or System.xxx.dll to another folder like package.
how I do that ? I replace all the path lib/netstardardxxxx to my path.
so it work well at Microsoft.AspNetCore.All 2.0.3 version.
but my question is :when i update to 2.2.0 version,it dose not work.
if i change the version to anything like 2.2.x,it will work well.
I find it have the same bug on linux and windows. now ,you kown what i say ?
忙碌中,對方又回了一條消息:
他說他隨便折騰一下,沒發現問題啊。
我能怎麼辦?只能把demo雙手奉上:
OK,I try it again.
I make a SourceCode and Demo,you can download on (5M) : http://mvc.taurus.cyqdata.com/WebPublish.rar
unrar and "dotnet Taurus.View.dll" on cmd,you will get the error message like:
and you replace 2.2.0 to 2.2.1 at Taurus.View.deps.json like this,and run again,it will be ok.
you you need the source code for building, you can download on (917K) : http://mvc.taurus.cyqdata.com/SourceCode.rar
對方告訴我,沒啥問題,原本就是找不到路徑文件,另外至於改版本號就變好了的問題,可能真是個bug,而後給我推薦升級到2.2版本:
Thanks a lot.
The immediate failure is caused by a missing file. The Microsoft.AspNetCore.Authentication.Abstraction.dll
is in fact not there. So it fails correctly.
If you change the version you effectively corrupt the .deps.json
. The entire string Microsoft.AspNetCore.Authentication.Abstraction/2.2.0
is a package identifier, which should exist in the libraries
section near the end of the .deps.json
file. As is the package section exists. If you change the version it won't find the package. I guess it's a bug that it won't fail in that case, in fact it simply ignores the assembly if it can't find the matching package section. This is definitely not expected, but I doubt we can fix it (if somebody relies on this behavior we would break them).
The app runs without the assembly just fine, at least the startup as I assume it doesn't need it. If it would run into code which needs it, it would fail at runtime.
Note that when I built it from source, it worked without any modifications (as the file was present).
As for the number of additional files in the app. I took your solution, changed all projects to target netcoreapp2.2 (since you're trying to use ASP.NET Core 2.2, it makes sense to target 2.2 for everything). And then I added this line to the Taurus.View_NetCore.csproj
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
Now when I publish the solution, I get only about 20 files in the output. Basically just the application plus 2 additional System.* assemblies.
我感受它沒發現我說的重點,因而用翻譯快速上了一段文字:
To facilitate the presentation of the problem,
I put Microsoft. AspNetCore. Authentication. Abstraction. dll in the Lib directory, and then the path of the configuration file was modified to point to it, so the file is supposed to exist, even if it is not used in the project, but the direction of the path is right, I don't know if you notice it.
Version number is no problem, after all, it is automatically generated by the system.
In addition, the 2.2.0 I mentioned above refers to the Nuget version package of ASPNET Core. It is not. NetApp version upgraded to 2.2. App version is still using 2.1.
對方開始慒B了,說了一堆,而後仍是推薦我上2.2版本:
I'm sorry - I don't understand your comment about the version number not being a problem. It is by design that the run fails if .deps.json
refers to a file which it can't find, so in your repro, the fact that it fails is expected.
I do agree that the fact that if the version number is changed (and thus doesn't match the package in the libraries section) the run will simply ignore the problem and the file and just continue is a bug. I have my doubts we would fix it though as it might break people.
By doing this the .deps.json
becomes invalid, and the current error checking is somewhat simplistic on .deps.json
- this is basically expected, as the .deps.json
is not meant to be used by humans - it is meant to be machine generated, and thus it's reasonable to expect correct input.
As for ASPNET Core versioning - I'm honestly surprised you can even run ASP.NET 2.2 on .NET Core 2.1, but I'm no expert in ASP.NET deployment.
To explain why you get so many files in the output:
.runtimeconfig.json
. You can see that your app references Microsoft.NETCore.App
there, which is the root framework (contains CoreCLR and CoreFX).Microsoft.AspNet.Core.App
in your .runtimeconfig.json
.Microsoft.AspNet.Core.App
version 2.2 which in turn has a reference to Microsoft.NETCore.App
version 2.2. And so the build system will be able to avoid all the system assemblies in the app and solely rely on the shared frameworks.我感受這問題彷佛要無解,又要從新描述問題了:
i mean,when you down from http://mvc.taurus.cyqdata.com/WebPublish.rar
and unrar , you will find lib/Microsoft. AspNetCore. Authentication. Abstraction. dll and this dll version is 2.2.0. the file is exists.
and the Taurus.View.deps.json , you look,it point to the same path.
so,tell me ,why can't find it ,the related path is error ?
這此,對方終於知道我要表達或關注點在什麼地方了:
不過它始終沒Get到個人點,或者我沒有Get到它的點,我只能強調,我上一版本V2.0.3是OK的,要不要弄個正常的Demo過去?
它想讓我把正常的.runtimeconfig.json文件發給它看看
因而,我轉身向服務器走去,我Down下了2.0.3那個運行正常的runtimeconfig.json文件,打開一看,what X,何時多了一行:
這不是我當年研究失敗時留下的東西麼,難道它是關鍵?
因而經過把這個屬性加上和關掉,從新運行了一下,XYZ,還真是它的問題,只有配置了這個路徑,deps.json上的路徑才能生效。
感受要分手了,給它回了最後一段話:
好聚好散,但它仍是堅持讓我升級到NetCore 2.2版本:
交涉地址:https://github.com/dotnet/core-setup/issues/5588
最後,發如今Github留下問題,仍是有點樂趣的~~~