我正在尝试为.Net程序集创建NuGet程序包,它会对原生的win32 dll进行pinvoke.我需要将程序集和本机dll打包,并将程序集添加到项目引用中(此部分没有问题),并且应将本机dll复制到项目输出目录或其他相关目录中.
我的问题是:
我正在尝试将 Nuget 包中的内容文件提取到引用我的包的项目中。
Packages.config 项目使用 content 文件夹
Project.json/PackageReference/NETCore SDK 项目使用 contentFiles 文件夹
太好了,我创建了一个 .NET Core 2.1 控制台应用程序项目,并遵循了NuGet ContentFiles Demystified博客文章,该文章于 2016 年撰写,project.json但现在仍然可以使用。
我创建了一个图像,c:\dev\ContentFilesExample\contentFiles\any\any\images\dnf.png然后创建了一个c:\dev\ContentFilesExample\ContentFilesExample.nuspec文件并复制粘贴了内容:
<?xml version="1.0"?>
<package>
<metadata minClientVersion="3.3.0">
<id>ContentFilesExample</id>
<version>1.0.0</version>
<authors>nuget</authors> <!-- The NuGet team authored this package -->
<owners>nuget</owners> <!-- The NuGet team owns this package -->
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>A content v2 example package.</description>
<tags>contentv2 contentFiles</tags>
<!-- Build actions for items in the contentFiles folder -->
<contentFiles>
<!-- Include …Run Code Online (Sandbox Code Playgroud) VS.NET中的解决方案资源管理器与.csproj文件中的预计值之间的配置值措辞不一致.在Solution Explorer一个.config或依赖文件将有多种选择Copy To Output Directory影响其构建和部署特性属性.
在Copy To Output Directory下拉列表中,我选择了.config文件的选项:Copy if newer.但是在.csproj文件中它的设置PreserveNewest如下所示:
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Run Code Online (Sandbox Code Playgroud)
我想可以得出结论,因为它是(2)不同的地方,术语不同是有道理的.我也可以看到XML文件中不允许"空格"的位置,但我仍然希望看到类似下面的内容.
<CopyToOutputDirectory>CopyIfNewer</CopyToOutputDirectory>
Run Code Online (Sandbox Code Playgroud)
是否有某些地方在MSDN中定义了这些"友好名称"如何映射到.csproj文件中的物理配置值?
我们有几个非.NET exes(例如PhantomJs),我们通过Process类从我们的.NET Web应用程序执行.
我想将这些exes包装到NuGet包中,以便它们可以可靠地放置在不同的环境(Web应用程序,控制台应用程序和单元测试)中,而无需将每个可能需要的版本预先放置在每台机器上的某个魔术位置.
是否有建议的方法在NuGet中执行此操作?
一种有效但似乎有点笨拙的方法是将EXE作为包装.NET dll中的资源嵌入,然后在运行时将其提取到文件系统.我想知道是否有更简单的方法.
请考虑以下nuspec文件:
<?xml version="1.0"?>
<package >
[SOME METADATA]
<files>
<file src="bin\x64\$configuration$\GR*.filetype" target="content\" />
</files>
</package>
Run Code Online (Sandbox Code Playgroud)
上面已经成功打包了以'GR'开头的文件类型文件,并将它们添加到我的新的引用解决方案中.
问题是我希望始终将这些文件复制到输出目录.我可以通过nuspec执行此操作,而无需在我的新解决方案中手动修改属性吗?
我的文本文件在我的类库项目中。我将其构建操作设置为内容并将复制到输出目录设置为复制(如果更新),因此 .csproj 具有如下部分:
<ItemGroup>
<Content Include="MyFile.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我需要使用我的类库中的文本文件,并且不能将其作为嵌入式资源,因为我希望允许最终用户对其进行编辑。当我使用 VS 2017 创建包时,它给了我一个 .nuspec ,其中包含如下部分:
<contentFiles>
<files include="any/net46/MyFile.txt" buildAction="Content" />
<files include="any/netstandard1.3/MyFile.txt" buildAction="Content" />
</contentFiles>
Run Code Online (Sandbox Code Playgroud)
然后,当我从另一个项目引用包时,MyFile.txt 出现在项目的根目录中,构建操作设置为内容,但复制到输出目录设置为不复制。我只想将该文件包含在 .dll 旁边,而不是包含在引用项目中。
我需要我的 NuGet 包将文件添加到项目并设置其“复制到输出目录”标志。
\n\n到目前为止,我正在使用脚本,如@workabyte to Set content files to \xe2\x80\x9ccopy local :always\xe2\x80\x9d in a nuget package 的答案install.ps1所示。
但我知道 NuGet 3.3 及更高版本使用其contentFiles模型提供本机支持本机支持。
我的理解是我创建一个目录结构,例如:
\n\ncontentFiles\\\n any\\\n any\\\n image.png\nRun Code Online (Sandbox Code Playgroud)\n\n然后在我的.nuspec:
contentFiles\\\n any\\\n any\\\n image.png\nRun Code Online (Sandbox Code Playgroud)\n\n编译包时,image.png会将其目录结构添加到.nupkg.
但是,当我在 Visual Studio (2017) 中安装该包时,它image.png甚至没有添加到项目中。
我究竟做错了什么?
\n我做了一个本机包,其中包括本机DLL.该包就像SqlServerCompact.4.0.8852.1.nupkg.
当我通过'Manage Nuget Packages ...'通过GUI安装软件包时,一切都很好,本机DLL被复制到Debug/Release文件夹.复制本机Dll是通过类似于SqlSerCompact中的脚本完成的.
我有以下.bat文件来自动化包装程序MyProject:
..\..\tools\nuget\bin\NuGet.exe install MyProject\packages.config -o packages\
..\..\tools\nuget\bin\NuGet.exe install MyProjectTest\packages.config -o packages\
..\..\tools\nuget\bin\nuget update MyProject.sln
msbuild /m /p:Configuration=Release /p:Platform="x64" MyProject.sln
..\..\tools\nuget\bin\nuget pack MyProject.nuspec
Run Code Online (Sandbox Code Playgroud)
上面的脚本运行得很完美MyProject.nupkg(编译只需要.Net dlls).但是nuget install,不执行依赖包中的复制脚本 - 因此编译MyProjectTest很好,但在执行其EXE时,其Debug/Release文件夹中没有本机DLL.
我的问题是为什么从命令行安装软件包时不执行powershell脚本?以及如何处理它?谢谢!