Dotnet 发布到同一文件夹

Posted

技术标签:

【中文标题】Dotnet 发布到同一文件夹【英文标题】:Dotnet Publish to Same Folder 【发布时间】:2021-10-11 14:04:04 【问题描述】:

当使用dotnet publish 将不同的独立 .csproj 项目构建/发布到同一文件夹时,预期的行为是什么?

想象一下Alpha.csproj 可能需要 NuGet 包 foo 在 1.0.0,而该项目 Bravo.csproj 可能需要相同 NuGet 依赖项的 2.0.0 版本。我担心这些不同项目上的两个单独的dotnet publish 调用,指向同一个目标文件夹,将导致foo 依赖被覆盖......从而破坏部署。

我知道 NuGet 经常将其二进制文件存储在子文件夹中,通常以版本号来区分,但它也很常见将依赖项直接放在主发布文件夹中。因此,从表面上看,存在意外冲突的空间。

到目前为止,我解决这个预期问题的方法是将两个项目放在同一个解决方案中,然后发布解决方案。我认为单个发布命令足以解决差异(将 foo 的不同依赖版本存储到不同的子文件夹中)。但是,如果这些项目处于不同的解决方案中怎么办?

我说“预期”的问题是因为我实际上并没有花时间尝试它。我的期限很紧,无法处理运行时出现的潜在隐蔽错误;我不想以“艰难的方式”发现我的问题的答案。

了解这种动态对我来说尤其重要,因为我正在构建 .Net Core 3.1 插件,我希望将其发布/部署到现有的框架文件夹。该应用程序旨在扫描新插件并加载它们。

【问题讨论】:

当两个项目在同一个解决方案中时,build会理清依赖关系(并使用更高版本的库)。但是对于两个不同解决方案的项目,我想你会不走运。同样,如果依赖 foo v1.0.0 和 v2.0.0 有不兼容的更改。 【参考方案1】:

预期的行为是最后发布的项目将覆盖发布目录中的现有文件,从而可能导致依赖版本冲突。

Single-file deployments 以更大的整体部署规模为代价,在发布到同一目录时更有可能不产生冲突。

【讨论】:

令我震惊的是,据我所知,几乎没有 MS 文档解释这种非常重要的行为。我很生气,我的 VS 解决方案中的主控制台应用程序“插件平台”需要对插件具有项目级依赖关系,以确保不存在程序集冲突。我非常希望插件可以独立发布。也就是说,如果将插件发布到子文件夹而不是主文件夹,也许我可以实现解决方案。有时间我会调查的。

以上是关于Dotnet 发布到同一文件夹的主要内容,如果未能解决你的问题,请参考以下文章

dotnet 测试:如何将程序集名称包含到 .trx 结果文件中?

将 VUE 和 Dotnet Core 部署到 IIS

DotNet Core .csproj 代码文件作为子项

C# 极限压缩 dotnet core 控制台发布文件

dotnet restore 不复制 NETStandard.Library 和其他框架包

C# 极限压缩 dotnet core 控制台发布文件