2017-07-23 53 views
3

編輯創建NuGet包與外部.exe文件:我做了什麼來解決這個問題:使用DOTNET包

創建一個新的NuGet包具有以下nuspec:

<package> 
    <metadata> 
    <id>VIPSNuget</id> 
    <version>1.0.0.0</version> 
    <title>$title$</title> 
    <authors>Devedse</authors> 
    <owners>Devedse</owners> 
    <licenseUrl>https://github.com/jcupitt/libvips/blob/master/COPYING</licenseUrl> 
    <projectUrl>https://github.com/jcupitt/libvips</projectUrl> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>Just the EXE file for VIPS</description> 
    <releaseNotes>First release</releaseNotes> 
    <copyright>Copyright 2017</copyright> 
    <tags>VIPS exe file</tags> 
    </metadata> 
    <files> 
    <file src="VIPS\*.*" target="tools" /> 
    </files> 
</package> 

全部置於該文件夾中的.exe文件。

現在從我的ImageOptimizer我使用下面的代碼:

var userProfileDir = System.Environment.GetEnvironmentVariable("USERPROFILE"); 
    string pathVips = Path.Combine(userProfileDir, Constants.VipsDir, "vips.exe"); 

一些背景

我目前工作的需要將圖像從使用JPEG轉換成PNG圖像處理庫名爲VIPS的外部工具。 (https://github.com/jcupitt/libvips)。

由於我不想在我自己的項目中包含來自VIPS的二進制文件,我認爲,讓我們製作一個NuGet包,它可以從我的代碼中調用.exe文件。

步驟我把

我創建一個使用「DOTNET新主機」命令建立新的dotnet核心解決方案。之後,我創建了一個名爲「VIPS」的目錄並粘貼了所有的二進制文件。

然後我創建了一個nuspec文件包含以下XML:

<?xml version="1.0"?> 
<package> 
    <metadata> 
    <id>$id$</id> 
    <version>$version$</version> 
    <title>$title$</title> 
    <authors>Devedse</authors> 
    <owners>Devedse</owners> 
    <licenseUrl>https://github.com/jcupitt/libvips/blob/master/COPYING</licenseUrl> 
    <projectUrl>https://github.com/jcupitt/libvips</projectUrl> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>Just the EXE file for VIPS</description> 
    <releaseNotes>First release</releaseNotes> 
    <copyright>Copyright 2017</copyright> 
    <tags>VIPS exe file</tags> 
    </metadata> 
    <files> 
    <file src="VIPS\*.*" target="tools" /> 
    </files> 
</package> 

我編輯我的.csproj文件,使其只包含在此:

<Project Sdk="Microsoft.NET.Sdk">  
    <PropertyGroup> 
    <TargetFramework>netstandard1.0</TargetFramework> 
    <Version>1.0.4.0</Version> 
    </PropertyGroup>  
</Project> 

問題

每當我現在運行'dotnet pack'命令,一切似乎都很順利: NuGet package created

但是,所有從VIPS目錄中的文件不包括在我創建nupkg: No tools directory

(我之所以選擇工具,是因爲在早期版本中DOTNET框架/的NuGet,我用的工具,如ILRepack那會自動安裝在工具目錄中,然後可以從部署的.exe文件的相對路徑中調用該工具目錄)。

(另見例如nuspec代碼https://github.com/gluck/il-repack/blob/master/build.gradle在92行,他們還包括在「工具」目標創建的.exe文件)

進一步調查

我又試圖爲將VIPS目錄中的所有文件添加到我的csproj文件中,並將構建操作設置爲內容。

所有二進制文件現在就包含在以下2個目錄(所以所有重複這也怪): vipsnuget.1.0.0.nupkg \內容\ VIPS \ vipsnuget.1.0.0.nupkg \ contentFiles \任何\ netstandard1。0 \ VIPS \

然而,當我現在包含NuGet包的另一個項目中,然後再次打包該項目似乎也包含在包中的所有二進制太:

Big file size

(所有VIPS二進制文件現在被放置在:DeveImageOptimizer.1.0.0.nupkg \ contentFiles \ any \ netstandard1.5 \,並且在內容\ VIPS中)

這不是真的需要,因爲DLL的實際大小應該只有是幾個Kb的。

另一個問題用這種方法

我實際上並不知道是否有這個好/更好的解決方案,但目前,在恢復NuGet包時,它會在%USERPROFILE%提取。 nuget \ packages \ vipsnuget ...

因此,無論何時我想運行鍼對VIPS.exe的命令,我需要將Process.Start參數指向%userprofile%...。有一個更好的方法嗎? (例如,發現其中的NuGet包在代碼中恢復的地方嗎?)

我想最好的

基本上我想最好的,是創建一個NuGet包的地方,如果你有它,一某些目錄將被複制到項目的構建輸出中。

因此,像: DeveImageOptimizer \ BIN \調試\ VIPS ...

如果不存在

如果沒有辦法做到這一點,我想聽到什麼正常的做法是將某些'工具'放入NuGet包中並從C#代碼中調用它們。

回答

1

當您調用dotnet pack而沒有任何參數時,它將使用當前文件夾中的.csproj文件創建nuget包並忽略任何.nuspec文件。如果查看dotnet pack參數,則不會找到如何直接指定.nuspec

但是,dotnet-pack文檔說,我們可以提供MSBuild屬性打包過程的dotnet pack命令。從NuGet metadata properties

NuspecFile被用於包裝的.nuspec文件

相對或絕對路徑。 說明

如果指定.nuspec文件,它將專門用於打包 信息,並且不會使用項目中的任何信息。

NuspecBasePath

爲.nuspec文件的基本路徑。

所以修改.csproj通過添加以下

<PropertyGroup> 
    <NuspecFile>location to your nuspec file</NuspecFile> 
</PropertyGroup> 

注:而你總是可以直接使用nuget pack命令。

+0

這確實解決了我的問題與工具沒有包括:)。但是,我現在怎樣才能調用VIPS.exe文件?我真的應該在Users \ ..... \。nuget目錄中調用它嗎?或者我可以以某種方式將它複製到我的程序的輸出目錄? – Devedse

+0

@Devedse看看[在nuget包中設置內容文件爲「copy local:always」](https://stackoverflow.com/questions/21143817/set-content-files-to-copy-local-always-in-一個-的NuGet包)。主要思想是使用'CopyToOutputDirectory'標誌[複製文件輸出](https://stackoverflow.com/questions/42750318/copying-a-file-in-net-core-csproj-file/42751376#comment77551434_42751376) – Set

+0

因此,您是否必須將所有DLL/EXE文件與Copy Local一起包含在csproj文件中,或者您也可以在nuspec文件中執行此操作? – Devedse