【NuGet】使用NuGet打包併發布至ProGet過程 (步驟詳細,附python腳本)【上篇】

1、基本知識html

(1)NuGet :python

      NuGet是一個爲你們所熟知的Visual Studio擴展,經過這個擴展,開發人員能夠很是方便地在Visual Studio中安裝或更新項目中所須要的第三方組件,同時也能夠經過NuGet來安裝一些Visual Studio的插件等。做爲一名開發人員,您可能也會開發一些公共組件以供他人使用,本文將一步步介紹如何以最簡單的方式將本身所開發的類庫包發佈到nuget上,以供更多的人使用[1]web

(2)ProGet:npm

       很是優秀的庫建立服務器,用於放置packages。支持nuget命令行上傳。其下載方式已經不用像站長大人[2]那麼繁瑣了,自己已自帶推薦安裝方式,一步一步去安裝便可。安裝完:緩存

      首次登錄的默認用戶名與密碼都爲:Admin安全

 

2、NuGet.exe生成包包並上傳至ProGet步驟[1,3]
(1) 獲取APIKey服務器

          去NuGet官網上註冊一個新的帳號,而後在My Account頁面,獲取一個API Key。 別忘了這個Apikey否則之後很麻煩的[4]分佈式

          做用詳解:由於包包須要發佈並共享,NuGet.exe專門提供了一條發佈命令。在發佈以前,須要在NuGet上建立一個帳號,而後獲得ApiKey。在庫上載包包以前,該命令將驗證庫的API密鑰。工具

(2) 下載NuGet.exeui

          NuGet.exe爲NuGet專用的命令行工具,去官網下載,官網首頁的下載包並必定適合你,最好在Download中選擇相應版本。下載完後還必須將其放在環境變量中。方法:右鍵「計算機」,「屬性」,「高級屬性設置」,「高級」中的「環境變量" , 」Path「,」編輯「,將NuGet.exe的路徑放進去。

(3) 用命令行設置ApiKey:

         nuget setApiKey 你的key值,使其存儲在安全的位置。

(4) 準備好本身的類庫項目

         程序包大多數狀況下僅包含一個程序集。這裏主要針對.csproj或者.vbproj文件建立程序包。

         務必打開AssemblyInfo.cs文件以更新程序集的元數據。

         在AssemblyInfo.cs文件中填寫好相應的信息,主要注意四個(信息全填上固然更好,後面修改nuspec文件還方便點兒):

         [assembly:Description("XXXX")]

         [assembly:ComVisible(false)]

         [assembly:Guid("XXXXXX")]

         [assembly:AssemblyVersion("X.X.X.X")]         

        

(5) 產生與修改nuspec文件

         nuspec是程序包清單文件,包含與程序包有關的重要元數據,例如:Id,版本,標題,做者,licenseUrL,projectUrl,描述,版權等等,此類信息大多數來自AssemblyInfo.cs。nuspec能夠經過nuget spec命令產生。在命令提示符下,進入TestForm.csproj文件所在目錄,而後執行:

           nuget spec    

        注意:我在TestForm.csproj中添加了依賴項Castle.Core,可是清單文件不會顯示這個依賴項,只有打成nupkg纔會顯示出來。nuspec的做用只是元數據清單顯示。

 

(6) 修改產生的nuspec文件

          用記事本打開TestForm.nuspec文件,把須要替換的信息替換掉,不須要的tag所有刪掉,注意裏面的$xxx$宏,這些就是引用了AssemblyInfo.cs中的設置值,在編譯產生package的時候,會使用AssemblyInfo.cs中的相應值進行替換。

         注意:1. <tags>標籤不能爲默認

                   2. <description>標籤不能爲默認

                   3. <releaseNotes>標籤不能爲默認

 

(7) 在TestForm.csproj路徑下使用命令行nuget pack 進行打包。

          基本命令:nuget pack TestForm.csproj

          NuGet會使用默認的項目配置所產生的程序集進行打包。若是項目默認是Debug,而你須要用Release打包,則使用下面的命令:

        Nuget pack TestForm.csproj -Prop Configuration=Release

        注意:1.若是同一個目錄中只有一個項目文件,則在運行命令時能夠省略項目文件名稱。

                2.若是是還沒有編譯項目,可先用Build標記編譯項目,而後壓縮它。這將在運行pack命令以前編譯項目:nuget pack TestForm.csproj -Build

 

        Nupkg包究竟包含哪些文件:

                1. libs文件,裏面包含生成的dll或者exe文件

                2. .rels文件

                3. Content_type.xml文件

                4. nuspec清單文件

                5. package文件夾,主要包含core-properties

                6. 其餘

        

        若是項目中含有依賴,生成的nupkg也會顯示出來:

        

        

(8) 發佈本身的包包到ProGet

        包包打包完就能夠上傳至ProGet了[5]

        命令行: nuget push "你的包包完整路徑"  你的ApiKey -Source 你的ProGetURL -ApiKey 你的用戶名:你的密碼

       最後瀏覽你的ProGet:

       咱們隨便打開一個項目,打開NuGet安裝包管理器,顯示 TestForm:

    

 

(9) 更新本身的包包到ProGet

        更新包包相對容易,只要你更改AssemblyInfo.cs中的信息,尤爲是版本信息,而後重複(7)與(8)便可:

        觀察ProGet:

      

3、ProGet使用方法 

        ProGet是一個很是全面的庫,該庫中主要包括三項:Feed,Packages,Connector。

        Feed用於創建倉庫,能創建Universal(通用庫)、NuGet庫、Chocolatey、Maven、npm、Bower六種庫。

        1. 創建Feed時首先選擇庫的類型,而後命名Feed名稱,而後出現配置畫面,若是設置好其中的NuGet ApiKey,之後nuget push 時就不用最後加一句-APIKey Username:Password了。

        DropPath應該是個緩存路徑,其原文翻譯:每次會掃描該路徑下的包包用以Import,若是Import成功,則會刪除該路徑下的全部包包。

         創建完Feed時記住它的Package Source URL:

         2. 創建Packages

        創建完Feed就能夠上傳你的packages了:

        3. Connectors

        Connector的做用是再鏈接一個包源,好比你當前的包源爲A,你能夠再設置一個Connector指向包源B,這樣在NuGet服務器上瀏覽你的包源A會發現包源B的資源也在。

        4. 使用NuGet安裝包管理器下載包包

        包包上傳完以後,咱們須要鏈接到該ProGet庫用以共享包包,在NuGet包管理器—>程序包管理器設置—>添加一個庫,就是點「+」,輸入名稱和源便可,點擊肯定便可。

      5. 使用包包:

      NuGet包管理器—>管理解決方案的NuGet程序包—>聯機,找到你定義的名稱便可:

 

4、融入Jenkins(python腳本) 

       流程圖:

 

       python腳本代碼:

# coding=gbk
import os
import sys
import re

def getdisc(projectpath):                   #得到項目文件的當前盤
    disc = projectpath.split(':',1)[0]
    disc = disc+":"
    return disc

def getAssemblyVersion(projectpath):       #根據Assembly獲取版本號
    assemblyInfoFile = projectpath+"/Properties/AssemblyInfo.cs"
    lines= open(assemblyInfoFile,'r+',encoding='iso-8859-15').readlines()
    flen=len(lines)-1
    for i in range(flen):
         if lines[i].startswith("[assembly: AssemblyVersion"):
            versioncode = lines[i].split('"',2)[1]
            break
    return versioncode

def modifynuspec(projectfilepath,projectname):   #修改nuspec文件內容
    li = os.listdir(projectfilepath)
    for filename in li:
      if filename.endswith(".nuspec"):
         nuspecfile = filename.replace(".nuspec",".xml")      #nuspec->xml
         nuspecfile = projectfilepath+"/"+nuspecfile
         filename = projectfilepath+"/"+filename
         os.rename(filename,nuspecfile)
         break
count=0 for filecsproj in li: if filecsproj.endswith(".csproj"): count+=1 if count==1: tfile = projectfilepath+"/"+projectname+".xml" else: tfile = projectfilepath+"/"+"Package.xml" f = open(tfile,'r') xmldata = f.read() xmldata = re.sub('\<description>(.*?)\</description>','<description>'+projectname+'</description>',xmldata) xmldata = re.sub('\<tags>(.*?)\</tags>','',xmldata) xmldata = re.sub('\<releaseNotes>(.*?)\</releaseNotes>','',xmldata) f.close() f = open(tfile,'w') f.write(xmldata) f.close() li = os.listdir(projectfilepath) for filename in li: if filename.endswith("Package.xml") or filename.endswith(''+projectname+'.xml'): nuspecfile = filename.replace(".xml",".nuspec") #xml->nuspec nuspecfile = projectfilepath+"/"+nuspecfile filename = projectfilepath+"/"+filename os.rename(filename,nuspecfile) break return if __name__ == '__main__': if len(sys.argv)!=8: sys.exit(-1) NuGetpath = sys.argv[1] Projectfilepath = sys.argv[2] Projectname = sys.argv[3] ProGetSourceUrl = sys.argv[4] ProGetAdmin =sys.argv[5] ProGetPassword =sys.argv[6] myApikey =sys.argv[7] NuGetdisc = getdisc(NuGetpath) ProjectDisc = getdisc(Projectfilepath) Projectnuspec =Projectfilepath+"/"+Projectname+".nuspec" if not os.path.exists(Projectnuspec): os.system(''+NuGetdisc+'&&cd '+NuGetpath+'&&nuget setApiKey '+myApikey+'') os.system(''+ProjectDisc+'&&cd '+Projectfilepath+'&&nuget spec') modifynuspec(Projectfilepath,Projectname) Projectnamecsproj = Projectname+".csproj" os.system(''+ProjectDisc+'&&cd '+Projectfilepath+'&&nuget pack '+Projectnamecsproj+'') ConvertProjectfilepath = Projectfilepath.replace("/","\\") Nupkgpath = ConvertProjectfilepath+"\\"+Projectname+"."+getAssemblyVersion(Projectfilepath)+".nupkg" os.system(''+NuGetdisc+'&&cd '+NuGetpath+'&&nuget push '+Nupkgpath+' '+myApikey+' -Source '+ProGetSourceUrl+' -ApiKey '+ProGetAdmin+':'+ProGetPassword+'')

注意:若是項目路徑下有多個.csproj文件,那麼進行nuget spec操做會產生一個名爲Package.nuspec的nuspec文件,而不是<項目名.nuspec>文件,千萬注意這點。

 

後記:

剛參加工做一月多,以前一直都是寫的C#代碼。組長讓我寫腳本去完成公司內項目文件的打包工做,一開始什麼都不知道,雖然平時用P4V和Git,但是發現本身並不瞭解分佈式控制的內涵,通過一星期組長對個人洗腦,擺正了許多錯誤的概念。那個星期我以爲我就是個智障,什麼都聽不懂,有時候好像懂了,但是和組長討論後又發現是錯了。還好,如今總算是明白了。根據組長對個人教育,我畫了個流程圖並本身開始寫代碼。

這篇博文的前部分參考了Reference的前三篇文章,他們的文章對我有不少的幫助,在他們的基礎上我進一步詳細說明了下。但願這篇博文對你們有幫助,歡迎留言討論。最後,感謝已經被我整奔潰的組長。

 

References:

[1] http://www.cnblogs.com/daxnet/archive/2013/05/07/3064577.html

[2] http://www.cnblogs.com/dudu/p/5147284.html

[3] http://blog.csdn.net/dandanzmc/article/details/42012429#comments

[4] https://www.nuget.org/

[5] http://inedo.com/proget

 

做者:airforce094

出處:http://www.cnblogs.com/lovecsharp094/p/5527204.html

轉載請註明原文出處 , 謝謝合做

相關文章
相關標籤/搜索