主頁 > .NET開發 > 為 .net 生態貢獻力量——制作并上傳 nuget 包(內有獨家彩蛋)

為 .net 生態貢獻力量——制作并上傳 nuget 包(內有獨家彩蛋)

2020-09-15 23:59:27 .NET開發

前言

       nuget 是 .net 的常用包管理器,目前已經內置到 Visual Studio 2012 以后的版本,大多數 .net 包都托管在 nuget.org,包括 .net core 框架基礎包,得益于 .net core 的模塊化設計,很多非核心包都可以進行一定程度的獨立升級,

       制作并上傳 nuget 包也同時成為為 .net 生態做貢獻的重要途經,因為 VS 2019 專案的 csproj 檔案支持大量與 nuget 打包相關的配置,所以大多數時候常規的 nuget 包都可以直接用 VS 制作,nuget.org 也只需要上傳生成的包檔案即可,十分方便,

正文

說明

       在此以我上傳到 nuget.org 的包 CoreDX.vJoy.Wrapper 為例進行說明,這個包是一個虛擬游戲手柄驅動的 C# SDK 包裝,對應 .net core 3.0+ 平臺,如果要使用,需要先安裝 vJoy 軟體,下載地址:http://vjoystick.sourceforge.net/site/index.php/download-a-install/download,叫 vJoy 的軟體有好幾個,要注意,有些是用來做鍵盤映射模擬手柄的用戶軟體,這個是面向開發者的純編程控制的虛擬手柄,想做鍵盤映射得自己寫軟體,

基礎操作

       1、新建類別庫專案,取名,然后一路下一步完成新建專案,

       2、打開 csproj 檔案,調整類別庫的目標框架,一般情況下盡量使用 netstandard 框架,并盡量降低依賴版本保證兼容性,現在一般是 2.0 居多,早期版本的標準 API 缺失比較嚴重,也可以右鍵專案屬性進行調整,只不過自由度不如直接編輯專案檔案,不過,這些都不是重點,重點是如何同時支持多個框架,這個只能直接編輯專案檔案,找到 <TargetFramework>netstandard2.0</TargetFramework>,把 TargetFramework 改成 TargetFrameworks,并用分號隔開不同的框架名,比如我的專案中就是這樣:<TargetFrameworks>netcoreapp3.0;netcoreapp3.1</TargetFrameworks>,netcoreapp 也是可以輸出為類別庫的哦,在不同框架使用不同代碼實作功能時可以使用條件編譯宏解決,例如:#if NETCOREAPP3_1 xxx代碼 #endif #if NET461 xxx代碼 #endif,然后愉快地寫代碼,

       3、右鍵專案屬性,找到打包選項卡,編輯 nuget 包資訊,比如包名、版本、作者、許可證、說明、著作權等等資訊,還有很多只能直接改專案檔案,大多數都可以在 <PropertyGroup> 節點下輸入 <Package,然后跳出來的智能提示就是能用的 nuget 包資訊節點,其中如果要上傳到 nuget.org,包名必須存在且不能與已有包重名;版本每次上傳都必須修改且只能更大;許可證必須指定,比如我的:<PackageLicenseExpression>MIT</PackageLicenseExpression> 指定了使用 MIT 許可證授權,

       4、專案右鍵打包,注意如果是要上傳的正式版包,需要切換到發行模式再打包,

       5、在瀏覽器打開 www.nuget.org,右上角登錄賬號,可以使用微軟賬號或 Github 賬號登錄,在頂部導航欄找到 Upload,上傳,包一般生成到 bin 檔案夾,上傳完成后會做一些校驗并展示預覽資訊,確認無誤后到底部點發布,等待網站進行安全檢查和索引創建,一般5到30分鐘,就可以在網站和 VS 中找到了,

擴展操作

       像我的包,動態參考了 x86 和 x64 程式集,這些參考是在程式運行時動態加載的,也就是說 nuget 打包工具是不認識的,這些動態參考就不會被打包,等其他人安裝包就會出錯,檔案缺失,如果我要把這些檔案一起打包,需要編輯專案檔案,就像這樣:

  <ItemGroup>
    <Content Include="x64\*.dll" Pack="true" PackageCopyToOutput="true" PackagePath="x64">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="x86\*.dll" Pack="true" PackageCopyToOutput="true" PackagePath="x86">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="CoreDX.vJoy.Wrapper.targets" Pack="true" PackageCopyToOutput="true" PackagePath="build/">
      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

       其中 Pack="true" 表示要將 include 的檔案一起打包,PackageCopyToOutput="true" 表示要輸出到指定位置, PackagePath 表示把檔案輸出到包的指定檔案夾,因為 nuget 包實際上就是個 zip 壓縮檔案,

       其中 .targets 是個特殊檔案,必須打包到 build 檔案夾才有用,如果不打包這個檔案,其他人安裝包后就會發現依然報錯,雖然包中確實有檔案,但并不會復制到專案中,targets 檔案就是負責告訴專案要怎么處理打包進去的額外檔案的,是個 xml 檔案,自己手動新建一個 xml 檔案修改擴展名就行,內容像這樣:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <None Include="$(MSBuildThisFileDirectory)\..\x86\vJoyInterface.dll">
            <Link>x86\vJoyInterface.dll</Link>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Include="$(MSBuildThisFileDirectory)\..\x86\vJoyInterfaceWrap.dll">
            <Link>x86\vJoyInterfaceWrap.dll</Link>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Include="$(MSBuildThisFileDirectory)\..\x64\vJoyInterface.dll">
            <Link>x64\vJoyInterface.dll</Link>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
        <None Include="$(MSBuildThisFileDirectory)\..\x64\vJoyInterfaceWrap.dll">
            <Link>x64\vJoyInterfaceWrap.dll</Link>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
</Project>

       有了這個檔案,其他人安裝包后,專案會自動讀取這個檔案并把這些檔案參考到專案,確保其他人使用正常,

結語

       本來這個東西只是自己寫著玩的,結果突發奇想去 nuget 找了一下發現沒有完善好用的類似的包,我就想要不上傳一個去 nuget 吧,結果就被這個動態參考的 dll 給坑了,打包以后這些 dll 沒有參考進來,百度找了半天也沒找到解決方案,也懶得搞梯子去谷歌,就直接去 GitHub 找了類似的開源專案原始碼研究他們是怎么搞的,試了半天才搞定,寫下這篇文章記錄下心路歷程,

       這篇文章也算是.Net Core 為 x86 和 x64 程式集撰寫 AnyCPU 包裝的續集,

 

       轉載請完整保留以下內容并在顯眼位置標注,未經授權洗掉以下內容進行轉載盜用的,保留追究法律責任的權利!

  本文地址:https://www.cnblogs.com/coredx/p/12578978.html

  完整源代碼:Github

  里面有各種小東西,這只是其中之一,不嫌棄的話可以Star一下,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/50960.html

標籤:.NET Core

上一篇:asp.net core系列 76 Apollo 快速安裝模式下填坑和ASP.NetCore結合使用

下一篇:IdentityServer4原始碼決議_3_認證介面

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more