使用dotnet pack

时间:2017-07-23 19:47:27

标签: c# nuget .net-core

编辑:我采取了哪些措施来解决这个问题:

使用以下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'命令时,一切似乎都没问题: NuGet package created

但是我创建的nupkg中没有包含VIPS目录中的所有文件: No tools directory

(我选择工具的原因是因为在早期版本的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包包含在另一个项目中,然后打包该项目时,它似乎也包含该包中的所有二进制文件:

Big file size

(所有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#代码中调用它们的正常方法。

1 个答案:

答案 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命令。