编辑:我做了什么来解决这个问题:
使用以下nuspec创建了一个新的NuGet包:
<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");
一些背景
我目前正在处理一个图像处理库,该库需要使用名为VIPS的外部工具将图像从JPEG转换为PNG。(https://github.com/jcupitt/libvips)。
由于我不想在我自己的项目中包含VIPS的二进制文件,因此让我们制作一个NuGet程序包,以便可以从我的代码中调用.exe文件。
我采取的步骤
我使用“ dotnet新控制台”命令创建了一个新的dotnet核心解决方案。之后,我创建了一个名为“ VIPS”的目录,并将所有二进制文件粘贴到该目录中。
然后,我创建了一个包含以下XML的nuspec文件:
<?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”命令时,一切似乎就正常了:
但是VIPS目录中的所有文件都未包含在我创建的nupkg中:
(之所以选择工具是因为,在早期版本的dotnet框架/ NuGet中,我使用了ILRepack之类的工具,这些工具会自动安装在工具目录中,然后可以从已部署的.exe文件的相对路径中调用该工具)。
(另请参见第92行的https://github.com/gluck/il-repack/blob/master/build.gradle中的nuspec代码,它们还将在'tools'目标中包含创建的.exe文件)
进一步的调查
然后,我尝试将VIPS目录中的所有文件添加到我的csproj文件中,并将生成操作设置为Content。
现在所有二进制文件都包含在以下2个目录中(因此所有重复项也很奇怪):vipsnuget.1.0.0.nupkg \ content \ VIPS \ vipsnuget.1.0.0.nupkg \ contentFiles \ any \ netstandard1.0 \ VIPS \
但是,当我现在在另一个项目中包含NuGet程序包,然后打包该项目时,它似乎也再次在该程序包中包含了所有二进制文件:
(现在,所有VIPS二进制文件都放在其中:DeveImageOptimizer.1.0.0.nupkg \ contentFiles \ any \ netstandard1.5 \,然后再次在content \ VIPS中)
这并不是真正可取的,因为其中的DLL的实际大小应该只有几个Kb。
这种方法的另一个问题
我实际上不确定是否有一个好的/更好的解决方案,但是目前,当还原NuGet程序包时,它将被提取到%userprofile%.nuget \ packages \ vipsnuget中。
因此,每当我要对VIPS.exe运行命令时,都需要将Process.Start参数指向%userprofile%...。有一个更好的方法吗?(例如,找到在代码中还原NuGet软件包的位置吗?)
我最想要的
基本上,我最想做的就是创建一个NuGet包,如果包含该包,则将某个目录复制到项目的生成输出中。
就像这样:DeveImageOptimizer \ bin \ debug \ VIPS ...
如果不存在
如果没有办法,我想听听将某些“工具”放入NuGet包并从C#代码内部调用它们的正常方法。
在dotnet pack
不带任何参数的情况下调用时,它将使用.csproj
当前文件夹中的文件来创建nuget包,并忽略任何.nuspec
文件。而且,如果查看dotnet pack
参数,您将找不到.nuspec
直接指定的方法。
但是,dotnet-pack文档说,我们可以为dotnet pack命令提供MSBuild属性,以进行打包过程。从NuGet元数据属性:
Nuspec文件
用于打包的.nuspec文件的相对或绝对路径。注意
如果指定了.nuspec文件,则该文件仅用于打包信息,而不会使用项目中的任何信息。
NuspecBasePath
.nuspec文件的基本路径。
因此,.csproj
通过添加以下内容来修改您的
<PropertyGroup>
<NuspecFile>location to your nuspec file</NuspecFile>
</PropertyGroup>
注意:并且您始终可以nuget pack
直接使用命令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句