如何让.NET Core项目复制NuGet引用来构建输出?

我正在尝试使用.NET Core编写一个插件系统,我的一个要求是能够将插件DLL及其依赖项分发给用户进行安装。 但是,我无法弄清楚如何将我的NuGet依赖项作为构建工件包含在内,并将它们输出到构建文件夹,而不必将dotnet publish作为hack使用。 有什么方法可以在csproj中指定它吗?

您可以将其添加到csproj文件中的以强制将NuGet程序集复制到构建的输出:

 true 

但是,请注意,构建输出( bin/Release/netcoreapp*/* )不应该是可移植和可分发的, dotnet publish的输出是。 但在您的情况下,将程序集复制到构建输出可能对测试非常有用。 但请注意,您还可以使用DependencyContext api来解析作为应用程序依赖关系图的一部分的DLL及其位置,而不是枚举本地目录。

您可以使用PostBuildEvent在构建时自动执行模块部署。

要在构建文件夹中获取NuGet程序集,请在模块的csproj中添加

  true  

使用包含/排除(根据需要修改路径)定义所需的模块文件

     

将您的构建文件夹重置为默认值并添加PostbuildEvent

      

如果它已经在运行以避免文件使用错误,我将包含app_offline以回收应用程序。

我以更简单的方式“解决”(创造了解决方法)。

在后期构建中

 dotnet publish "$(ProjectFileName)" --no-build -o pub xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)" 

pub是您希望发布的内容用于暂存的文件夹

注意:根据您使用的dotnet.exe版本,命令--no-build可能不可用。

例如,在v2.0.3中不可用; 并在v2.1.402中提供。 我知道VS2017 Update4有v2.0.3。 Update8有2.1.x.

更新:

上面的设置将在基本调试环境中工作,但是需要将其置于构建服务器/生产环境中。 在我必须解决的这个特定示例中,我们分别构建了Release|x64Release|x86 。 所以我占了两个。 但是为了支持post build dotnet publish命令,我首先将RuntimeIdentifier添加到项目文件中。

  ..\..\lib\ win-x64   ..\..\lib\ win-x86  

为什么我需要它以及为什么没有它就可以逃脱? 我需要这个,因为我的构建程序设置为拦截警告MSB3270 ,并且如果它出现,则失败。 这个警告说,“嘿,你的依赖项中的一些文件格式错误”。 但你还记得这次演习的目标吗? 我们需要提取包依赖DLL。 在许多情况下,如果出现此警告并不重要,因为后续构建并不关心。 同样,这是我关心的构建程序。 所以,我只将RuntimeIdentifier添加到我在生产构建期间使用的2个配置中。

完整的post构建

 if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)" xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y if $(ConfigurationName) == Release ( dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies ) else ( dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies ) xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R 

说明:dotnet发布正在寻找obj\Debugobj\Release 。 我们在构建期间没有它,因为build会创建obj\x64\Releaseobj\x86\Release 。 第1行和第2行缓解了这个问题。 在第3行中,我告诉dotnet.exe使用特定配置和目标运行时。 否则,当这是调试模式时,我不关心运行时的东西和警告。 在最后一行,我只需将我的dll复制到输出文件夹中。 任务完成。

结合上面的答案:我在Post-build事件命令行中使用它很好在Visual Studio中。 它循环选择dll (System * .dll和Microsoft .dll)*,然后跳过删除特定的dll。 System.Data.SqlClient.dllSystem.Runtime.Loader.dll

 for %%f in ($(OutDir)System*.dll $(OutDir)Microsoft*.dll) do if not %%f == $(OutDir)System.Data.SqlClient.dll if not %%f == $(OutDir)System.Runtime.Loader.dll del %%f