使用dotnet pack使用外部.exe文件创建NuGet软件包

德维塞

编辑:我做了什么来解决这个问题:

使用以下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”命令时,一切似乎就正常了: NuGet包已创建

但是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

.nu​​spec文件的基本路径。

因此,.csproj通过添加以下内容来修改您

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

注意:并且您始终可以nuget pack直接使用命令。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

卸载使用nuget.exe安装的nuget软件包

使用dotnet CLI显示过时的nuget软件包

如何使用DotNet.Contracts NuGet软件包?

无法使用dotnet CLI和nuspec文件打包NuGet软件包

使用NuGet Pack时,是否可以不使用nuspec文件来指定软件包名称?

我使用错误的.exe文件创建Chocolatey软件包吗?

使用“ nuget.exe恢复解决方案”时,软件包文件夹中的版本号错误

如何在Ubuntu 14.04上使用dotnet CLI注册新的NuGet软件包源?

在dotnet core v1.0中使用HtmlAgilityPack NuGet软件包

如何使用dotnet cli列出可用的软件包版本?

如何使用程序集中的版本号创建预发布的nuget软件包

使用Visual Studio Pack将构建目录包含在nuget软件包中

更改Visual Studio 2017使用的NuGet软件包文件夹

使用RStudio创建软件包文档?

如何使用CMake创建软件包

无法使用dotnet添加软件包安装软件包

使用pyinstaller运行具有xgboost软件包的exe文件时出错

如何使用nuget.exe命令行获取特定Visual Studio解决方案的软件包列表

使用Nuget软件包资源管理器来构建软件包

如何在PowerShell脚本中使用NuGet软件包?

使用OpenHardwareMonitor NuGet软件包获取VRAM Total

使用NuGet进行全局软件包安装

无法使用正确的.NET版本安装NuGet软件包

使用NuGet下载旧版本的软件包

如何使用NuGet的Open RIA Services软件包

使用Powershell的Nuget软件包版本差异分析

在Linux上使用docfx.console nuget软件包

如何管理多次使用的Nuget软件包

无法使用 dotnet 核心添加 nuget 包