RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 890179
Accepted
Monk
Monk
Asked:2020-10-07 22:33:11 +0000 UTC2020-10-07 22:33:11 +0000 UTC 2020-10-07 22:33:11 +0000 UTC

构建依赖和构建

  • 772

有一个桌面解决方案(4.6 和网络标准 2.0),其中实际上存在三个级别的依赖关系——共享程序集(内核)、UI 程序集和插件(更准确地说,有几个,但它们是在依赖性方面相同)。

UI 程序集依赖于内核,正常构建在需要时成功复制程序集,不幸的是排除了本机依赖项。插件仍然更难过,因为。它们依赖于内核,但没有人应该知道它们,不能使用标准依赖项。

现在构建部分由 beforebuild 事件保证,但由于 不相关的项目可以按不同的顺序编译,有时你必须愚蠢地编译两次。另外,现在它是使用 xcopy 完成的,但我想要一个跨平台的构建。

据我了解,目标文件有一个选项,但除了文章https://rsdn.org/article/devtools/msbuild-05.xml#EVGAE之外,我没有找到任何有意义的帮助

另外,还有像 Cake (C# Make) 这样的不同的东西,但实际上这是一个单独的工具,你必须学习如何使用,而且这些解决方案的跨平台性也不清楚。

一般来说,你需要一些流行的解决方案,它有很好的dock,并且可以在没有拐杖的情况下做典型的解决方案(这样你就不必手动编写msbuild来构建项目)。


它现在的样子的一个例子。实线是明确的依赖关系,虚线是隐含的依赖关系,您必须在拐杖上从不同的文件夹复制到不同的文件夹。 在此处输入图像描述

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Monk
    2020-10-18T15:09:37Z2020-10-18T15:09:37Z

    结果,msbuild 关闭了我所有的任务,尽管有些地方看起来很尴尬。


    为插件编写了一个简单的单独目标:

    <Project>
      <!-- Copy plugin dll and pdb files to shared folder after compile -->
      <Target Name="CopyAfterCompile" AfterTargets="CopyFilesToOutputDirectory">
        <ItemGroup>
          <SourceFiles Include="$(TargetPath)" />
          <SourceFiles Include="$(TargetDir)$(TargetName).pdb" />
        </ItemGroup>
        <Copy SourceFiles="@(SourceFiles)" 
              DestinationFiles="@(SourceFiles->'$(ProjectDir)\..\Bin\$(ConfigurationName)\$(TargetFramework)\%(RecursiveDir)%(Filename)%(Extension)')" />
      </Target> 
    </Project>
    

    然后,这样的目标很容易通过文件名连接到插件项目,<Import Project="..\Sites.props"/>并自动将程序集复制到所需的文件夹。

    PS:这里要单独说明一下TargetFramework,但它只适用于多目标项目,例如我的是在net461和netstandard2.0下制作的


    我在 netstandard 中将应用程序构建为自包含的,并且在这里添加程序集仅与“发布”事件挂钩,尽管 Google 上有很多其他提示。看起来像这样:

      <!-- Copy native libs - skiasharp and sqlite interops -->
      <Target Name="CopyNativeLibraries" AfterTargets="Publish">
        <PropertyGroup>
          <UserRoot>$(userprofile)</UserRoot>
          <UserRoot Condition="'$(userprofile)' == ''">$(HOME)</UserRoot>
        </PropertyGroup>
        <ItemGroup>
          <Library Include="$(UserRoot)\.nuget\packages\skiasharp\1.57.1\runtimes\osx\native\libSkiaSharp.dylib" />
          <Library Include="$(UserRoot)\.nuget\packages\skiasharp\1.57.1\runtimes\win7-x64\native\libSkiaSharp.dll" />
        </ItemGroup>
        <Copy SourceFiles="@(Library)" 
              DestinationFiles="@(Library->'$([System.IO.Path]::GetFullPath('$(PublishDir)'))\%(RecursiveDir)%(Filename)%(Extension)')" />
      </Target>
    

    实际上,开发者skiasharp 已经修复了发布他的构建,但还没有发布。但是对于 sqlite interops,更新已经发布,所以这里只剩下skia。

    PS:UserRoot 变量正在尝试确定 nuget 所在的文件夹。它不完全是跨平台的,但 Linux 和 Windows 在当前实现中工作。


    一般来说,要分析目标的执行顺序并分析周围发生的事情,msbuild -v:diag使用构建或发布就足够了。该日志还将记录所有已处理的目标及其顺序。与我在问题中提到的同一个 Cake 相比,msbuild 的一大优点是它已经有一堆计算变量,你只需要使用它们。此外,他的生命周期非常合乎逻辑(根据日志),并且很容易将目标与现有目标绑定。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5