如何为引用的nuget包指定输出文件夹?

2023-12-02

我有一个项目引用了一些 nuget 包。

在输出文件夹中(bin\Debug or bin\Release),所有引用的库都位于可执行文件旁边。

如何指定库的输出文件夹?
我想要所有 nuget 库bin\Release\Libs并可执行于bin\Release.


今天早上我很早就醒了,决定自己尝试一下。事实证明速度相当快,但这可能是因为我在查看 MSBuild 文件方面有(不幸的)经验。写这篇文章比写目标花了我更长的时间。

根据您的问题,我假设您使用的是传统项目,因为 SDK 样式项目仅在 bin 目录中创建项目的程序集。不过,我更喜欢 SDK 风格的项目,因为可以快速轻松地使用 dotnet cli 创建测试项目,并且 csproj 更容易编辑。因此,我将向您提供找到 SDK 样式项目解决方案的步骤,您需要按照传统项目执行类似的操作。

因此,我们想要更改文件的复制位置,这意味着我们需要修改一些项目。 MSBuild 中的所有内容都在目标中运行,因此我们需要知道何时运行自定义目标、要修改哪些项目以及可能要修改这些项目的哪些元数据。我创建了一个新项目,添加了一些 NuGet 引用,然后运行dotnet msbuild -t:publish -bl并打开了msbuild.binlog file.

要更改哪些元数据

搜索来自 nuget 包的 dll 的名称,我发现一条消息说复制自 ... 到 ...,因此我单击它转到条目,然后按照树返回到任务,该任务我看到是内置的复制任务。该任务的目标路径是 Publish -> _PublishBuildAlternative -> ComputeAndCopyFilesToPublisDirectory -> CopyFilesToPublishDIRECory -> _CopyResolvedFilesToPublishAlways。双击我看到的复制任务

    <Copy SourceFiles = "@(_ResolvedFileToPublishAlways)"
          DestinationFiles="@(_ResolvedFileToPublishAlways->'$(PublishDir)%(RelativePath)')"
          OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
          Retries="$(CopyRetryCount)"
          RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
          UseHardlinksIfPossible="$(CreateHardLinksForPublishFilesIfPossible)"
          UseSymboliclinksIfPossible="$(CreateSymbolicLinksForPublishFilesIfPossible)">

所以,我猜我需要修改RelativePath的元数据_ResolvedFileToPublishAlways item.

要更改什么项目

旁注:MSBuild 没有公共/私有修改,因此通常使用约定。任何以下划线开头的内容都应该被视为可能在版本之间更改的实现细节,因此最好使用不以下划线开头的内容,并且维护目标文件的团队应该更加努力不要破坏兼容性。

所以,自从_ResolvedFileToPublishAlways以下划线开头,让我们看看它是在哪里创建的。搜索它会将我带到一个目标,binlog 告诉我它已添加到名为的目标中_ComputeResolvedFilesToPublishTypes,它的定义是

  <Target Name="_ComputeResolvedFilesToPublishTypes">
    <ItemGroup>
      <_ResolvedFileToPublishPreserveNewest Include="@(ResolvedFileToPublish)"
                                             Condition="'%(ResolvedFileToPublish.CopyToPublishDirectory)'=='PreserveNewest'" />

      <_ResolvedFileToPublishAlways Include="@(ResolvedFileToPublish)"
                                     Condition="'%(ResolvedFileToPublish.CopyToPublishDirectory)'=='Always'" />
    </ItemGroup>
  </Target>

所以,我可以看到它只是复制ResolvedFileToPublish项目到新项目名称。查找这些项目的创建位置,它位于名为的目标中ComputeFilesToPublish,并展开树以查看创建的所有项目及其元数据,我猜想我想要修改的项目都具有AssetType = runtime,这非常适合我们需要使用的条件。

何时运行我们的目标

理想情况下我会在之前跑步CopyFilesToPublishDirectory,但是看看它的定义我发现

  <Target Name="CopyFilesToPublishDirectory"
          DependsOnTargets="_CopyResolvedFilesToPublishPreserveNewest;
                            _CopyResolvedFilesToPublishAlways" />

问题是,当 MSBuild 执行目标时,它按以下顺序运行:

  1. 列出的任何目标DependsOnTargets
  2. 将当前目标列为的任何目标BeforeTargets
  3. 当前目标
  4. 将当前目标列为的任何目标AfterTargets

所以,虽然我想跑步BeforeTargets='CopyFilesToPublishDirectory', the DependsOnTargets将在我的目标之前运行,所以我不能这样做。所以我会选择跑步AfterTargets="ComputeFilesToPublish"。还有其他目标在这些目标之间运行,其中一个听起来可能会添加ResolvedFileToPublish项目,但对于我当前的项目,目标由于条件而无法运行,因此我的自定义目标可能不够通用,无法适用于所有项目。

编写我们的自定义目标

现在我们知道我们的目标何时运行、它将修改哪些项目以及我们将如何修改它们的元数据。

  <Target Name="RedirectRuntimeFilesToBinDirectory" AfterTargets="ComputeFilesToPublish">
    <ItemGroup>
      <ResolvedFileToPublish Condition=" '%(ResolvedFileToPublish.AssetType)' == 'runtime' ">
        <RelativePath>lib\%(RelativePath)</RelativePath>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>

不幸的是,二进制日志没有显示有关正在修改的元数据的详细信息,这在尝试调试构建问题以及为什么某些项目具有意外值时确实很痛苦,但无论如何,我现在已经成功更改了目标NuGet 依赖项,可能还有项目到项目引用、到lib\目录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为引用的nuget包指定输出文件夹? 的相关文章

随机推荐

  • NumericUpDown 背景色未按预期工作

    我最近需要编写 Windows NumericUpDown 控件的一个版本 该控件可以突出显示某个值是否是强制的 它需要通过更改控件的背景颜色来做到这一点 我认为这足够简单 但在尝试这样做时 我发现它有一个奇怪的副作用 即无法完全绘制所有控
  • 紧急回滚后如何将回滚的变更集+修复签入 TFS

    我们使用 VS2013 偶然向 TFS 提交了一些代码 这创建了变更集 2 为了修复这个错误 我们将变更集 2 回滚到本地计算机 然后我们提交了变更集 2 的回滚 从而创建了变更集 3 现在我们想要获取我们最初在本地计算机上错误签入的代码
  • 如何在 python 中制作固定大小的格式化字符串? [复制]

    这个问题在这里已经有答案了 我想创建一个具有固定大小和字段之间固定位置的格式化字符串 一个例子可以更好地解释 这里显然有 3 个不同的字段 并且字符串是固定大小的 XXX 123 98 00 YYYYY 3 1 00 ZZ 42 123 3
  • 无法加载文件或程序集'file:///C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ asp.net vs2010

    昨天我的项目运行顺利 但今天我遇到了错误 详细信息如下 无法加载文件或程序集 file C WINDOWS Microsoft NET Framework v4 0 30319 Temporary ASP NET Files parktms
  • 如何创建可在 IronPython 中处理的 C# 事件处理程序?

    如何创建可在 IronPython 中处理的 C 事件处理程序 请注意 我使用的是 IronPython 2 0 1 我能够毫无问题地处理来自系统类的事件 例如 Window KeyDown 但是当我尝试定义自己的 C 事件时 当我尝试从
  • 从 nhibernate 中的 INSERT 命令中排除属性

    我有一个具有我希望只读属性的实体 这意味着当我将此实体插入数据库时 SqlServer 将自动生成该属性的值 因此我需要 nhibernate 在执行 INSERT 命令时忽略此属性 但在选择时检索它实体 重要提示 此属性不是ID 我不希望
  • codemirror:搜索并突出显示多个单词,无需对话框

    客观的 我在用代码镜像作为编辑 我想要 搜索并突出显示多个字符串 我希望能够迭代找到的每个匹配项并打印其行号 我想以编程方式执行此操作 并且不想使用对话框 如示例所示https codemirror net demo search html
  • linux redhat 6 并安装 easy_install

    我对此完全陌生 需要一些帮助 我有一个运行 Linux Redhat 6 并使用 Python 2 7 刚刚被设置为 Python 2 6 的默认值 的托管服务器 位于 usr local bin python2 7 我正在尝试在服务器上设
  • Android 示例应用程序未显示

    这里是新的 Android 开发人员 我正在关注以下教程http www vogella de 第一个应用程序 进行温度转换 有效 第二个 执行首选项并使用菜单 永远不会出现 我尝试过使用 Helios 和 Galileo 我尝试过重新安装
  • 发布应用时删除 AdMob 的测试设备 ID 是个好主意吗?

    我正准备在 Play 商店中启动一个应用程序 在尝试使用 AdMob 在测试模式下使用我的设备 ID 后 我现在想知道是否应该删除测试设备 ID 只保留 TEST EMULATOR 你觉得怎么样 有必要吗 是的 您应该在发布之前删除测试模式
  • 更新管理元框字段中的产品帖子元数据

    我正在尝试使用 update post meta 函数更新 WooCommerce 产品元数据 但它不起作用 这是我的代码 function woo add deal general fields save post id post id
  • 如何设置Active Directory用户的锁定时间和密码

    我想更改AD用户的userAccountControl和密码 用户已在 AD 中创建 该用户是使用 AD 中的 python ldap 模块创建的 处于 禁用 状态并且没有密码 AD 托管在 win2k8R2 上 当我使用 pythion
  • 当 Flexbox 项目以列模式换行时,容器不会增加其宽度

    我正在研究一个嵌套的弹性盒布局 它应该按如下方式工作 最外层 ul main 是一个水平列表 当添加更多项目时 该列表必须向右扩展 如果它变得太大 应该有一个水平滚动条 main display flex flex direction ro
  • Postsharp:它是如何工作的?

    遵循建议我的另一个问题 我将引用的代码转换为与 PostSharp 一起使用 属性 Serializable public sealed class InitAttribute OnMethodBoundaryAspect public o
  • 用黄金代替 ld - 有什么经验吗?

    有没有人尝试过使用gold代替ld gold promises比ld 因此它可能有助于加快大型 C 应用程序的测试周期 但它可以用作 ld 的直接替代品吗 Can gcc g 直接打电话gold 是否存在任何已知的错误或问题 虽然gold自
  • JSONEncoder 和 PropertyListEncoder 不符合 Encoder?

    我正在尝试写一个Encoder Decoder包装给定的对Encoder Decoder 这个包装器的目标是成功处理循环引用 这两者都不是 JSONEncoder nor PropertyListEncoderdo 并将实际的编码 解码委托
  • 帮助理解 Ruby 中的产量和枚举器

    如果有人能帮助我理解在枚举器中使用 Yielder 与仅在枚举器中调用 Yielder 之间的区别 我将不胜感激 接地气的 Rubyist 表明人们不会 从区块中屈服 但没有准确解释发生了什么 Thanks 如果您首先了解产量的工作原理可能
  • PowerShell的echo和CMD的echo的区别

    我在 PowerShell 中得到以下信息 D gt echo Apple Pie git hash object stdin 157cb7be4778a9cfad23b6fb514e364522167053 D gt Apple Pie
  • 打开excel文件时出现运行时错误

    我正在尝试打开 Excel 文件button click事件 我打开的前四个 Excel 文件没有遇到任何错误 但当我的宏打开第五个文件时 它会停止并显示此运行时错误 Run time error 2147021892 80070bbc o
  • 如何为引用的nuget包指定输出文件夹?

    我有一个项目引用了一些 nuget 包 在输出文件夹中 bin Debug or bin Release 所有引用的库都位于可执行文件旁边 如何指定库的输出文件夹 我想要所有 nuget 库bin Release Libs并可执行于bin