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

来源:https://www.cnblogs.com/coredx/archive/2020/03/27/12578978.html
-Advertisement-
Play Games

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


前言

       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一下。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • shape函數是numpy.core.fromnumeric中的函數,它的功能是讀取矩陣的長度,比如shape[0]就是讀取矩陣第一維度的長度。它的輸入參數可以使一個整數表示維度,也可以是一個矩陣。這麼說你可能不太理解,我們還是用各種例子來說明他的用法: 一維矩陣[1]返回值為(1L,) 二維矩陣, ...
  • 什麼場景下會有main函數? 當該python腳本被作為模塊(module)引入(import)時,其中的main()函數將不會被執行。 main函數的作用? __ name__ == '__ main__'是Python的main函數入口。並非說,加入這句才能使用python xxx.py來執行, ...
  • 引言 構建分散式系統並不容易。然而,人們日常所使用的應用大多基於分散式系統,在短時間內依賴於分散式系統的現狀並不會改變。ApacheZooKeeper旨在減輕構建健壯的分散式系統的任務。ZooKeeper基於 分散式計算的核心概念而設計,主要目的是給開發人員提供一套容易理解和開發的介面,從而簡化分佈 ...
  • 下麵是互相轉換的代碼: 有想要瞭解更多關於python知識的請在下方評論或私信小編 ...
  • title: Java基礎語法(3) 運算符 blog: "CSDN" data: "Java學習路線及視頻" 1.算術運算符 算術運算符的註意問題 如果對負數取模,可以把模數負號忽略不記,如:5% 2=1。 但被模數是負數則不可忽略。此外,取模運算的結果不一定總是整數。 對於除號“/”,它的整數除 ...
  • 字元串的常用操作 很好理解 字元串可以用 ' + ' 連接,或者乘一個常數重覆輸出字元串 字元串的索引操作 通過一對中括弧可以找到字元串中的某個字元 可以通過正負數雙向操作噢 用一個中括弧來實現 為什麼沒有-0??去清醒腦子想想 -0 和 0 有差嗎? 還有一個切片操作 就像切菜那樣簡單,同樣是中括 ...
  • 中間件分類 ASP.NET Core 中間件的配置方法可以分為以上三種,對應的Helper方法分別是:Run(), Use(), Map()。 Run(),使用Run調用中間件的時候,會直接返回一個響應,所以後續的中間件將不會被執行了。 Use(),它會對請求做一些工作或處理,例如添加一些請求的上下 ...
  • 簡單的介紹一下集合,通俗來講就是用來保管多個數據的方案。比如說我們是一個公司的倉庫管理,公司有一堆貨物需要管理,有同類的,有不同類的,總而言之就是很多、很亂。我們對照集合的概念對倉庫進行管理的話,那麼 數組就是將一堆貨整整齊齊的碼在倉庫的某個地方,普通列表也是如此;Set就是在倉庫里有這麼一個貨架, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...