㈠ 如何將electron框架開發的軟體包打包成單一exe文件
前言:研究electron自動更新的時候,在electron的官方文檔auto-updater 中,提到了在幾個平台mac,linux,windows下electron 的自動更新方法,其中windsow平台上面,文章中建議先用grunt-electron-installer 模塊來創建windows安裝包,grunt這個工具是由Squirrel集成的。進而了解下Squirrel這個工具,
一個可以用來給electron應用的安裝更新卸載添加快捷方式的工具。本文主要提及如何在windows平台下,用Squirrel創建electron的.exe安裝包。
創建nuget包
我們的方法是使用nuget工具創建Nuget包,再使用Squirrel工具創建.exe。
1.下載squirrel.exe和nuget.exe,也可以選擇直接安裝Squirrel.Windows (需要有vitual
studio環境)。
2.新建文件夾如my-build,把下載好的squirrel.exe,nuget.exe和setup.exe
放進去,在文件夾放入我們未打包的electron應用,如下圖:
4.在my-build根目錄中,打開命令行執行nuget spec
如下圖:
生成 spec包初始文件
5.編輯器打開 Package.nuspec,按照自己項目的需要編輯這個文件,如下圖:
這里需要注意:根據Squirrel文檔說明,target folder 屬性需要設置為lib/net45,否則並沒有用;<iconUrl>標簽用來制定未來的exe的icon。
5.用下面的命令創建一個nuget包,
nuget pack Package.nuspec
如下圖:
之後在目錄中會出現這個包
命名規則就是<my_app_name>.<version>.nupkg
創建安裝程序
把應用程序打包成nuget包之後,就可以用squirrel創建一個安裝程序了。在根目錄打開命令行,執行以下命令:
squirrel --releasify <my_app_name>.<version>.nupkg
這個時候命令行中沒有任何提示。但是別慌,編譯一段時間後程序會創建一個release文件夾,裡面有三個文件,nuget包,RELEASES 文件和安裝文件Setup.exe。如下圖:
如果沒有出現這三個文件,可以查看目錄中的SquirrelSetup.log,根據裡面的報錯,來進行調試。
注意上面這條squirrel 命令,可以用來設置setup.exe在安裝過程中用傳統icon還是用自定義的圖片文件。使用Squirrel --help可以查看更多幫助
發布應用和安裝應用
把上一步生成的setup.exe發送給想要安裝這個應用的用戶,就可以了。
最終應用會被安裝在C:\Users\Administrator\AppData\Local\[appname] 文件夾中,注意Squirrel 的日誌文件也存在目錄中,調試安裝問題的時候非常有用。
雙擊我們的setup.exe進行安裝app的測試,如果中途有任何出錯,在
C:\Users\Administrator\AppData\Local\SquirrelTemp 裡面可以看到安裝日誌。如下圖:
安裝之後打開C:\Users\Administrator\AppData\Local 目錄,可以看到app安裝在這里,如下圖:
自動創建快捷方式
進入我們安裝之後的文件夾,命令行進入C:\Users\Administrator\AppData\Local\[your appname],執行 Update.exe --help ,可以看到
不知道從上圖你有沒有得到什麼提示,反正我發現了,在命令行手動創建快捷方式的命令是Update.exe --createshortcut electron\electron.exe -i [your ico toute]\app.ico
所以,如果我們想讓應用在安裝過程中靜默地創建好快捷方式,那就需要在app的安裝之後相反設法執行這句代碼。
因為我們的.exe會在安裝之後自動打開程序,所以我在程序的入口main.js,添加sqruieel事件的監聽就好了。如下圖:
我順便把程序卸載時,刪除快捷方式的監聽事件也寫了進去。還有程序的更新和刪除事件監聽,但是這兩個事件,我還沒有進行測試。
更新應用
其實我一直很想做增量更新,在這里我的更新方法有兩個,第一是在程序的入口添加js,發送請求到伺服器,拉取更改文件進行本地替換,但是如果是node_mole依賴包的更改,這個方法並不可行。第二個方法比較安全而且快捷通過發布一個版本號不同的exe,如下:1.在這個創建安裝程序的步驟2中,我們把程序代碼都復制到了這個文件夾裡面,如下圖:
如果後續我們的程序要進行更新,首先我們需要把更改的文件直接復制替換到這個文件夾。
2.打開Package.nuspec,編輯version標簽
3.參考本文種中創建安裝程序部分的步驟2-4,重新生成setup.exe,發布應用。
通過執行setip.exe安裝,程序會自動刪除之前的應用,但是我並不清楚,sqruieel 是進行了增量替換,還是將之前的整個應用進行刪除,再重新安裝。
創建自定義安裝包
在上一步,我們已經把自己的exe發布出來了,但是如果沒有自定義名字跟icon,好像還不夠酷,所以我們需要創建自定義的安裝文件。
1.下載安裝 Resource
Hacker
2.打開這個項目目錄,在electron.exe上面右鍵
出現菜單,點擊 Open using Rescource Hacker。
3.Resource Hacker應用運行之後中,在以下界面中選擇Icon,然後在工具欄裡面選擇Action,Replace
Icon,如下圖:
然後選擇自己想要替換的.ico文件就好
4.這其實並不夠,我們還需要更換exe裡面的版本信息,打開Version
Info,把FileDescription和ProctName改成我們自己的項目名稱,最好把SquirrelAwareVersion也更改一下,畢竟是版本號。
5.做完這些之後,我們需要按照之前的步驟,在命令行中輸入
nuget pack Package.nuspec
重新生成nuget包,然後再使用
squirrel --releasify <my_app_name>.<version>.nupkg 命令創建安裝文件。
6.打開之後生成的releases文件夾,參考本文種中創建安裝程序部分的步驟2-4,對setup.exe進行自定義。
最後,一個可以自動更新又安裝便捷,還有我們自己的酷酷的圖標跟名字的應用就生成拉!
㈡ 如何把.net core 打包到nuget
以往做nuget包一般要麼用命令行,要麼用nuget的圖形化界面去做,但是一些操作比較麻煩.比如引入命名空間,引入第三方nuget包。這些在.NET Core項目里卻很簡單,只需要使用命令行dotnet pack,在.NET Core系列 : 1、.NET Core 環境搭建和命令行CLI入門做了簡要介紹,下面來詳細介紹下這個命令。dotnet-pack- 將代碼打包成 NuGet 包
一.概要
dotnet pack [--output] [--no-build] [--build-base-path] [--configuration] [--version-suffix] [<project>]
二.描述
dotnet pack命令生成項目並創建 NuGet 包。這個操作的結果是兩個nupkg擴展名的包。一個包含代碼,另一個包含調試符號。
該項目被依賴的 NuGet 包裝被添加到 nuspec 文件,因此,能夠在安裝包時得到解決。
默認情況下,項目到項目之間的引用是不打包到項目中的。如果想那樣做,需要在依賴中引用需要項目的type節點設置為 「build」 ,設置就像下面的例子:
裡面僅有一個 lib 文件 netstandard1.6 目標配置文件。這意味著, NuGet 包只適用於.Net Core 應用程序 針對 NetStandard1.6 (和即將到來的 4.6.3)。
㈢ 如何使用nuget添加第三方組件
使用NuGet發布自己的類庫包(Library Package)
NuGet是一個為大家所熟知的Visual Studio擴展,通過這個擴展,開發人員可以非常方便地在Visual Studio中安裝或更新項目中所需要的第三方組件,同時也可以通過NuGet來安裝一些Visual Studio的插件等。作為一名開發人員,您可能也會開發一些公共組件以供他人使用,本文將一步步介紹如何以最簡單的方式將自己所開發的類庫包發布到nuget上,以供更多的人使用。
背景
如果你還是不知道什麼是NuGet,那麼就看這樣一個案例:我現在需要在我的項目中引用Castle.Core程序集,按照以往的做法,就是從Castle Projects官方網站,下載一個最新版本的dll,然後把它復制到項目的lib目錄下(或者隨便什麼地方都行),這樣做不僅繁瑣,而且你需要時刻關心官網上這個程序集的最新版本信息(當然或許你也不會去關注),更煩的是,如果你是一個開源項目的Contributor,你還需要花一定的時間去管理所有的這些libs,不僅如此,如果你是使用的源代碼管理系統來管理項目源碼,比如使用git等,那你還不得不把這些libs上傳到源代碼管理系統中,否則團隊中的其他組員即使獲得了源代碼,也無法正確編譯。但這樣做又大大增加了源代碼的存儲空間,使得代碼克隆和下載都變得非常耗時。
現在,就可以直接使用NuGet來解決所有問題,我們先創建一個Class Library,命名為DaxnetNugetTest,然後在這個項目上點右鍵,選擇Manage NuGet Packages:
在彈出的對話框中,搜索Castle關鍵字,然後在搜索結果列表中選擇Castle.Core,單擊Install按鈕:
安裝完成後,Castle.Core的程序集就被引用到項目中了,同時在項目中多出了一個packages.config文件,以向NuGet表明,當前項目使用了哪些Package,版本是什麼,以及是基於哪個版本的.NET Framework。
今後,如果Castle.Core程序集有版本更新,則同樣可以使用Manage NuGet Packages菜單打開上面的對話框,然後在左邊的Updates列表中,就會列出發生了版本更新的Package,如果有,則單擊Update按鈕即可更新。
更有趣的是,如果你在解決方案上點右鍵,選擇Enable NuGet Package Restore菜單,那麼在你編譯項目的時候,NuGet會自動分析出你項目所依賴的第三方組件,然後在編譯開始之前會自動上網下載所需的版本,因此,你也就不要去維護這些libs了,更沒必要把這些libs也上傳到源代碼管理系統中。
不過這些也都不是本文的重點,本文的重點是,介紹如何將自己的Class Library發布到NuGet上。
發布自己的類庫包(Library Package)
STEP 1:在NuGet上注冊並獲取API Key
首先,你需要到NuGet上注冊一個新的賬號,然後在My Account頁面,獲取一個API Key,這個過程很簡單,我就不作說明了。
STEP 2:下載NuGet.exe
NuGet有個命令行工具:NuGet.exe,非常好用,不過使用之前需要下載,下載地址:http://nuget.codeplex.com/downloads/get/669083。為了方便使用,請設置機器的PATH環境變數,將NuGet.exe的路徑添加到PATH中。
STEP 3:設置API Key
使用以下命令設置NuGet API Key:
1
nuget setApiKey <my_api_key>
記得將上面的my_api_key替換為STEP 1中獲得的API Key。
STEP 4:開發自己的類庫(Class Library)
上面我們新建了一個類庫:DaxnetNugetTest,並通過NuGet添加了對Castle.Core的引用,現在我們添加一些代碼,來使用Castle.Core所提供的一些功能。我們將Class1.cs改名為CastleHelper.cs,此時也會將Class1類改名為CastleHelper。在CastleHelper.cs中寫入以下代碼:
1
2
3
4
5
6
7
public class CastleHelper
{
public static Castle.Core.Pair<int, int> GetIntPair()
{
return new Castle.Core.Pair<int, int>(20, 30);
}
}
然後,打開AssemblyInfo.cs文件,將assembly的屬性設置好,記得再設置一下AssemblyVersion特性,以指定我們類庫的版本。目前我們使用1.0.0.0版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[assembly: AssemblyTitle("DaxnetNugetTest")]
[assembly: AssemblyDescription("Daxnet's test of the NuGet.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("daxnet")]
[assembly: AssemblyProct("DaxnetNugetTest")]
[assembly: AssemblyCopyright("Copyright © daxnet 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("20662b9f-91de-4515-9c8c-ced3d61589e1")]
[assembly: AssemblyVersion("1.0.0.0")]
全部設置好以後,編譯整個項目待用。
STEP 5:產生並修改nuspec
nuspec是NuGet將項目打包成nupkg的輸入文件,可以通過nuget spec命令產生。在命令提示符下,進入DaxnetNugetTest.csproj文件所在目錄,然後執行:
1
nuget spec
此時會提示創建成功:
用notepad打開DaxnetNugetTest.nuspec文件,把需要替換的信息替換掉,不需要的tag全部刪掉,注意裡面的$xxx$宏,這些就是引用了AssemblyInfo.cs中的設置值,在編譯產生package的時候,會使用AssemblyInfo.cs中的相應值進行替換。完成編輯後,我們的nuspec文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
<projectUrl>http://apworks.org</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>First release</releaseNotes>
<right>Copyright 2013</right>
</metadata>
</package>
注意兩點:1、$description$使用AssemblyDescriptionAttribute的值進行替換,在產生package之前,一定要記得先編譯項目,否則會提示$description$找不到的錯誤;2、releaseNotes如果沒有,就直接刪掉這個節點,如果有,則填入自己的內容,不要使用默認內容,否則會在下一步產生警告信息。
STEP 6:產生類庫包(Library Package)
同樣在DaxnetNugetTest.csproj路徑下,使用下面的命令產生NuGet類庫包:
1
nuget pack DaxnetNugetTest.csproj
成功後,提示:
注意:由於我們的項目通過NuGet引用了Castle.Core,因此,它將會作為一個依賴組件(dependency)打包到產生的nupkg文件中。
另外,NuGet會使用默認的項目配置所產生的程序集進行打包。如果項目默認是Debug,而你需要用Release打包,則使用下面的命令:
1
nuget pack DaxnetNugetTest.csproj -Prop Configuration=Release
STEP 7:發布類庫包
現在,通過以下命令發布類庫包:
1
nuget push DaxnetNugetTest.1.0.0.0.nupkg
完成以後,出現以下提示:
STEP 8:測試已發布的類庫包
新建一個控制台應用程序,在項目上點右鍵,選擇Manage NuGet Packages,在搜索框中輸入DaxnetNugetTest,此時我們發布的Package已經可以顯示了:
單擊Install按鈕,NuGet會自動分析組件依賴關系,然後把所需要的所有程序集都下載下來並添加到項目引用中:
寫一點代碼來測試:
1
2
3
4
5
6
7
8
9
class Program
{
static void Main(string[] args)
{
var pair = DaxnetNugetTest.CastleHelper.GetIntPair();
Console.WriteLine(pair.First);
Console.WriteLine(pair.Second);
}
}
輸出如下:
STEP 9:更新類庫包
隨著類庫開發進度不斷向前,必然會有版本更新。更新類庫包很簡單,只需要在AssemblyInfo.cs中更新一下版本號,然後重新執行上面的STEP 6、7即可。注意在執行STEP 7的時候,nupkg的文件名應該使用新版本的文件名。
現在,我們重新打開DaxnetNugetTest項目,將CastleHelper類中的20,30改為40,50,然後打開AssemblyInfo.cs,版本號升級為2.0.0.0,重新編譯項目,並重新產生、發布nupkg:
再打開用來測試的控制台程序,同樣打開Manage NuGet Packages對話框,我們可以在Updates中看到,DaxnetNugetTest有了更新:
點擊Update按鈕,將類庫更新到最新版本。重新運行這個控制台程序,我們發現,輸出已經是最新版本的值了:
STEP 10:刪除已發布的包
原則上,NuGet不允許用戶刪除已發布的包,而只能將其設置為不顯示在Manage NuGet Packages的列表中。打開www.nuget.org,用已注冊的賬戶登錄後,可以在My Account頁面選擇Manage My Packages鏈接進入管理頁面:
進入後,可以看到我們已發布的Packages:
點擊DaxnetNugetTest左邊的小垃圾桶圖標,即可進入Listing頁面,頁面中我們也能看到「Permanently deleting packages is not supported」的提示。要將Package從Package List中移除,只需要去掉List DaxnetNugetTest 2.0.0.0 in search results選項前面的鉤鉤,然後單擊Save按鈕保存即可:
總結
本文簡要介紹了NuGet的使用,並介紹了一種將自己開發的類庫以NuGet Package的方式發布到NuGet伺服器的簡單方法。NuGet功能非常強大,有興趣的朋友可以上www.nuget.org進行學習研究。
㈣ 如何用jenkins自動生成nuget包
關於NuGet的介紹已經很多,可以參考下面的:
NuGet學習筆記(1)——初識NuGet及快速安裝使用 http://kb.cnblogs.com/page/143190/
NuGet學習筆記(2)——使用圖形化界面打包自己的類庫 http://kb.cnblogs.com/page/143191/
NuGet學習筆記(3)——搭建屬於自己的NuGet伺服器 http://kb.cnblogs.com/page/143192/
上面的文章介紹了搭建Web版本的NuGet伺服器以及用圖形化的方式生成NuGet包。
用NuGet.Server管好自家的包包 http://www.cnblogs.com//archive/2012/06/05/nuget_server_push.html
上面的文章介紹了搭建Web版本的NuGet伺服器,以及自動化生成NuGet包的方法
本文介紹簡單的NuGet伺服器,以及VS2013自動化生成NuGet包的內容。
一、VS自動生成NuGet包
1、在VS中創建類庫項目
2、啟用NuGet程序包還原(Enable
NuGet Package Restore)
在解決方案上右擊,選擇「啟用NuGet程序包還原」
確定後會在解決方案中增加一個「.nuget"文件夾,該文件夾有三個文件。
此時,打開項目文件ClassLibrary1.csproj,可以看到類似下面的內容,注意:下面綠色背景行的內容是否出現在ClassLibrary1.csproj中
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists(『$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props『)" />
<PropertyGroup>
<Configuration Condition=" 『$(Configuration)『 == 『『 ">Debug</Configuration>
<Platform Condition=" 『$(Platform)『 == 『『 ">AnyCPU</Platform>
<ProjectGuid>{92A6F604-9829-49FB-8B06-FF2E4C757EC4}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ClassLibrary1</RootNamespace>
<AssemblyName>ClassLibrary1</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == 『『 Or $(SolutionDir) == 『*Undefined*『">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" 『$(Configuration)|$(Platform)『 == 『Debug|AnyCPU『 ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" 『$(Configuration)|$(Platform)『 == 『Release|AnyCPU『 ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists(『$(SolutionDir)\.nuget\NuGet.targets『)" />
<Target Name="" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists(『$(SolutionDir)\.nuget\NuGet.targets『)" Text="$([System.String]::Format(『$(ErrorText)『, 『$(SolutionDir)\.nuget\NuGet.targets『))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
如果沒有出現帶加號行的內容,需要手動添加上。
第2塊綠背景內的代碼創建了對.nuget文件夾下的NuGet.targets文件的引用,並添加了缺少NuGet.targets文件的錯誤信息。
第1塊綠背景內的第1行代碼創建了SolutionDir 並設置默認值為項目的父目錄,NuGet.targets利用這個配置值來找到他需要的NuGet.exe等資源。
第二行代碼,RestorePackages被設置為True。
3、設置BuildPackages
2中啟用了NuGet還原,但是還需要設置讓NuGet自動生成nupkg包文件,用記事本打開.csproj文件添加下面1行語句
<BuildPackage>true</BuildPackage>
到1下一行的話,Debug和Release編譯均生成包
到2下一行的話,只用Debug編譯才生成包
到3下一行的話,只用Release編譯才生成包
4、編譯
編譯後就可以再bin文件夾下看到.nupkg文件了
㈤ c#如何把一個main()和若干個dll打包生成單一的exe文件
首先安裝.net framework 2.0或以上
安裝後找到所在文件夾
比如我的是win2003 目錄是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
看裡面是不是有很多.exe程序,有版一個就是要用到權的,名字叫csc.exe
這個文件很重要他是c#編譯器,vs也是用它來生成程序的
開始-運行-cmd
以我的目錄為例
cd: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
打開這個目錄
csc.exe X:\..\*.cs /reference:X:\..\*.DLL /target:X:\..\*.exe
帶引用DLL的程序就可以生成了
X就是盤符(c,d..z)也就是.cs,.dll文件的全路徑,*在此可做通配符,/target就是生成的文件的存放位置,*在此處應該是新程序的名字
這個程序很強(廢話,編譯器可不是一般人能做出來的),你可以輸入
csc /?
他會列出它的各個參數及說明
找了點資料給你看看