如何让.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|x64
和Release|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\Debug
或obj\Release
。 我们在构建期间没有它,因为build会创建obj\x64\Release
或obj\x86\Release
。 第1行和第2行缓解了这个问题。 在第3行中,我告诉dotnet.exe
使用特定配置和目标运行时。 否则,当这是调试模式时,我不关心运行时的东西和警告。 在最后一行,我只需将我的dll复制到输出文件夹中。 任务完成。
结合上面的答案:我在Post-build事件命令行中使用它很好:在Visual Studio中。 它循环选择dll (System * .dll和Microsoft .dll)*,然后跳过删除特定的dll。 System.Data.SqlClient.dll和System.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