编辑创建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