2017-07-23 43 views
3

编辑创建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'命令,一切似乎都很顺利: NuGet package created

但是,所有从VIPS目录中的文件不包括在我创建nupkg: No tools directory

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

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

当您调用dotnet pack而没有任何参数时,它将使用当前文件夹中的.csproj文件创建nuget包并忽略任何.nuspec文件。如果查看dotnet pack参数,则不会找到如何直接指定.nuspec

但是,dotnet-pack文档说,我们可以提供MSBuild属性打包过程的dotnet pack命令。从NuGet metadata properties

NuspecFile被用于包装的.nuspec文件

相对或绝对路径。 说明

如果指定.nuspec文件,它将专门用于打包 信息,并且不会使用项目中的任何信息。

NuspecBasePath

为.nuspec文件的基本路径。

所以修改.csproj通过添加以下

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

注:而你总是可以直接使用nuget pack命令。

+0

这确实解决了我的问题与工具没有包括:)。但是,我现在怎样才能调用VIPS.exe文件?我真的应该在Users \ ..... \。nuget目录中调用它吗?或者我可以以某种方式将它复制到我的程序的输出目录? – Devedse

+0

@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

+0

因此,您是否必须将所有DLL/EXE文件与Copy Local一起包含在csproj文件中,或者您也可以在nuspec文件中执行此操作? – Devedse