Visual Studio - 建置的時候自動產生NuGet Package

02 November 2014 — Written by Sky Chang
#NuGet#Visual Studio

最近因為在寫一些Framwork給公司使用,雖然透過DLL直接給大家用也很方便,但畢竟這個時代,已經是NuGet的時代了,所以理想的情況下,還是放在NuGet上,比較方便 ( 當然,給公司用的Framework是自行架立的NuGet私服… )

而建立NuGet Package的過程中,我們可以透過NuGet的指令,或是NuGet Package Exploer,但NuGet指令要準備一堆東西…而NuGet Package Exploer則會遇到相依信套件要自己塞的窘境…而最最最理想的就是透過MSBuild的過程中,自動產生NuGet Package;這樣才符合懶人Sky的形象~~

所以去網路上找了一下,有些人有寫了一些套件,有些人有準備了一些專案,但還是看到這篇最符合小弟…( 原文連結在底下… ),所以就在這邊敘述一下過程。

首先,必須先啟用NuGet套件還原,是的,大家沒看錯,就是套件還原;這邊會使用套件還原的原因是因為,我們透過套件還原這個功能,可以幫我們把參數都給設定好,所以幾乎都不用做甚麼事情了… ( 懶人指數 + 1 )。

image

而套件還原功能開啟之後,還必須先隨便的使用NuGet下載任一套件,並且編輯,小弟這邊下載的是Json.Net。

為什麼要隨便下載一個套件勒!?,原因很簡單,因為你隨便下載一個套件之後,並且重Build,他才會自動的在專案檔下加入必要的參數。

加入的項目如下,基本上裡面的參數都是和套件還原有關的。

image

如下圖,我們可以看到,預設情況下,幫我們增加了NuGet的相關參數。

image

而實際上,到上面為止,都是處於套件還原的功能,所以我們要在專案檔這邊,加入BuildPackage的標籤,並且改為true;沒錯,就是這樣而已,這樣就可以了!!

image

這邊是原始的專案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喔~

image

第一步驟就到這邊,就是那麼簡單~~

參考資料

Sky & Study4.TW