編輯創建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'命令,一切似乎都很順利:
(我之所以選擇工具,是因爲在早期版本中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包的另一個項目中,然後再次打包該項目似乎也包含在包中的所有二進制太:
(所有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#代碼中調用它們。
這確實解決了我的問題與工具沒有包括:)。但是,我現在怎樣才能調用VIPS.exe文件?我真的應該在Users \ ..... \。nuget目錄中調用它嗎?或者我可以以某種方式將它複製到我的程序的輸出目錄? – Devedse
@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
因此,您是否必須將所有DLL/EXE文件與Copy Local一起包含在csproj文件中,或者您也可以在nuspec文件中執行此操作? – Devedse