2016-06-07 168 views
8

我正在使用Nuget包資源管理器來創建一些nuget包。我已經設法在VS中以發佈模式構建項目,並將dll和pdb文件添加到包中。如何使用nuget package explorer創建一個包含release和debug dll的nuget包?

到目前爲止這麼好,但是當我將包添加到另一個項目中並嘗試在調試時插入代碼時,它將替代它。

據我所知,我需要構建並添加Debug dll和pdb到我的包中,如果我想在調試時插入代碼。我不確定如何將這些添加到我已經創建的包中,這些包已經包含Release dll和pdb文件,它們的命名方式相同。

有什麼想法?

回答

5

我的想法是,NuGet包裝是很多約定。

有一個在(在同一個封裝中lib/net40/mydll.dlllib/net35/mydll.dll等)的包裝相同的命名空間和相同的名稱爲不同平臺沒有問題,因爲的NuGet將平臺篩選註冊的依賴。

針對相同平臺構建多個版本似乎非常規,this discussion傾向於每個構建包。這並不意味着你不能這樣做,但你應該首先問自己是否應該這樣做。這就是說,如果你的調試和發佈版本是非常不同的(條件編譯等),但這可能很有用。但是,在安裝軟件包時,最終用戶如何選擇Release或Debug?

一個想法可能是,每個版本配置一個版本。 Both can be installed into the project。要做到這一點,可以添加一個targets file to your package或者編譯a powershell install script,它可以直接在目標項目文件中添加條件引用,如果你想要的東西比任何MsBuild可以爲你做的都要少。第一戰術

示例:創建.TARGET文件(在你的包,創建一個build文件夾,然後用下面的內容創建build\YourLib.targets):

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<ItemGroup Condition="'$(Configuration)' == 'Debug'"> 
    <Reference Include="YourLib"> 
     <HintPath>..\packages\YourLib.1.0.0\lib\Debug\YourLib.dll</HintPath> 
    </Reference> 
    </ItemGroup> 

    <ItemGroup Condition="'$(Configuration)' == 'Release'"> 
    <Reference Include="YourLib"> 
     <HintPath>..\packages\YourLib.1.0.0\lib\Release\YourLib.dll</HintPath> 
    </Reference> 
    </ItemGroup> 
</Project> 

提供了創建調試和發佈文件夾(平臺文件夾是可選的),構建輸出將根據配置有效更改 - 提供的數據包使用者具有傳統配置名稱,但您可以始終使用$(Configuration).Contains etc擴展條件邏輯,或者只是將其放在包中自述文件

3

受@Tewr的啓發,我發現了一個繁瑣的工作解決方案。

創建以下文件結構的NuGet:

lib\net\$(Configuration)\YourLib.1.0.0.dll <---- put here some dummy file named YourLib.1.0.0.dll 
tools\release\YourLib.1.0.0.dll <--- put here the release version 
tools\debug\YourLib.1.0.0.dll <--- put here the debug version 
build\YourLib.targets 

的目標文件內容:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<Target Name="CopyReferences" BeforeTargets="Build" Condition="Exists('..\packages\YourLib.1.0.0\lib\net\%24(Configuration)')">  
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Release" /> 
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Debug" /> 
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Release\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Release"' /> 
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Debug\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Debug"' /> 
    <Exec Command='rmdir /S /Q "..\packages\YourLib.1.0.0\lib\net\%24(Configuration)"' /> 
</Target> 

lib中的dll文件文件夾將被自動添加爲引用創建以下項目文件中:

<Reference Include="YourLib> 
    <HintPath>..\packages\YourLib.1.0.0\lib\net\$(Configuration)\YourLib.1.0.0.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

一旦你構建項目的第一次,則目標將複製從工具的發行和調試版本\釋放工具\調試文件夾的lib \網絡\釋放的lib \網\調試文件夾。最後,它會刪除lib \ net \ $(配置)文件夾

享受(或不 - 我個人不喜歡解決方案)。

+1

這個答案應該關注。謝謝。 –