Visual Studio - 建置的時候自動產生NuGet Package
最近因為在寫一些Framwork給公司使用,雖然透過DLL直接給大家用也很方便,但畢竟這個時代,已經是NuGet的時代了,所以理想的情況下,還是放在NuGet上,比較方便 ( 當然,給公司用的Framework是自行架立的NuGet私服… )
而建立NuGet Package的過程中,我們可以透過NuGet的指令,或是NuGet Package Exploer,但NuGet指令要準備一堆東西…而NuGet Package Exploer則會遇到相依信套件要自己塞的窘境…而最最最理想的就是透過MSBuild的過程中,自動產生NuGet Package;這樣才符合懶人Sky的形象~~
所以去網路上找了一下,有些人有寫了一些套件,有些人有準備了一些專案,但還是看到這篇最符合小弟…( 原文連結在底下… ),所以就在這邊敘述一下過程。
首先,必須先啟用NuGet套件還原,是的,大家沒看錯,就是套件還原;這邊會使用套件還原的原因是因為,我們透過套件還原這個功能,可以幫我們把參數都給設定好,所以幾乎都不用做甚麼事情了… ( 懶人指數 + 1 )。
而套件還原功能開啟之後,還必須先隨便的使用NuGet下載任一套件,並且編輯,小弟這邊下載的是Json.Net。
為什麼要隨便下載一個套件勒!?,原因很簡單,因為你隨便下載一個套件之後,並且重Build,他才會自動的在專案檔下加入必要的參數。
加入的項目如下,基本上裡面的參數都是和套件還原有關的。
如下圖,我們可以看到,預設情況下,幫我們增加了NuGet的相關參數。
而實際上,到上面為止,都是處於套件還原的功能,所以我們要在專案檔這邊,加入BuildPackage的標籤,並且改為true;沒錯,就是這樣而已,這樣就可以了!!
這邊是原始的專案xml,有興趣的大家可以自由貼上。
<?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>{42ED14CC-0FAD-452C-966B-B484FE6BEDC2}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ClassLibrary2</RootNamespace>
<AssemblyName>ClassLibrary2</AssemblyName>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<BuildPackage>true</BuildPackage>
</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="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<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>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>此專案參照此電腦中缺少的 NuGet 套件。啟用「NuGet 套件還原」
以便下載。如需詳細資訊,請參閱 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的檔案為 {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>
當加入那行之後,我們重新Build後,就可以在bin底下的debug看到nupkg的檔案產生了!!其中symbols是提供偵錯用途的,裡面包含了source喔~
第一步驟就到這邊,就是那麼簡單~~
參考資料