编辑:我采取了哪些措施来解决这个问题:
使用以下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 new console'命令创建了一个新的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'命令时,一切似乎都没问题:
(我选择工具的原因是因为在早期版本的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 \内容\ 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#代码中调用它们的正常方法。
答案 0 :(得分:3)
当您在没有任何参数的情况下调用dotnet pack
时,它会使用当前文件夹中的.csproj
文件来创建nuget包并忽略任何.nuspec
个文件。如果查看dotnet pack
参数,您将无法找到如何直接指定.nuspec
。
但是,dotnet-pack文档说我们可以为dotnet pack命令提供MSBuild属性以进行打包过程。来自NuGet metadata properties:
<强> NuspecFile 强>
用于打包的.nuspec文件的相对路径或绝对路径。 注意
如果指定了.nuspec文件,则它专门用于打包 信息和项目中的任何信息都没有使用。
<强> NuspecBasePath 强>
.nuspec文件的基本路径。
通过添加以下内容
修改您的.csproj
<PropertyGroup>
<NuspecFile>location to your nuspec file</NuspecFile>
</PropertyGroup>
注意:您始终可以直接使用nuget pack
命令。