zoukankan      html  css  js  c++  java
  • 2019-7-3-Roslyn-理解-msbuild-的清理过程

    title author date CreateTime categories
    Roslyn 理解 msbuild 的清理过程
    lindexi
    2019-07-03 18:21:25 +0800
    2019-07-03 17:35:51 +0800
    Roslyn MSBuild 编译器

    在开发的时候,小伙伴会使用右击解决方案,点击清理解决方案。在这个按钮点击的背后 msbuild 做了什么?为什么很多时候的清理之后还存在一堆文件?如何让自己想的 Target 也支持清理

    在点击清理按钮的时候,将会执行 msbuild 的清理代码,对应的 Clean 这个 Target 将会被执行

    在 Clean 执行的时候,是如何让 msbuild 知道哪些文件可以删除,哪些文件不能被删除?在编译的过程和清理的过程是独立,如何在清理的过程能知道编译的时候生成了哪些文件是属于可删除的

    两个过程之间的通信最简单的就是使用文件,在 msbuild 编译的时候,将会生成一个 .FileListAbsolute.txt 文件,可以在清理的时候通过读取这个文件知道有哪些内容是可以删除的

    尝试新建一个项目,在这个项目的 obj 文件夹里面找到 .FileListAbsolute.txt 文件,打开这个文件的内容,尝试在里面删除或添加一项,然后执行清理命令

    此时将会发现在 .FileListAbsolute.txt 列出的文件将会被删除,没有被列出的文件将不会删除

    这也就是为什么使用清理之后还有很多文件没有删除,因为这些文件都没有加入到 .FileListAbsolute.txt 列表

    那么使用这个机制,如何让自己写的 Target 支持在清理的时候删除创建的临时文件?

    此时有两个方法,第一个方法就是使用 msbuild 清理的方法,在编译的时候添加创建的文件进入可以删除的文件列表

    通过 $(IntermediateOutputPath)$(CleanFile) 可以拿到对应的清理文件

    于是在这个文件里面写入需要删除的文件列表就可以,注意写入的是绝对路径

    上面方法的好处是如果在编译的时候会创建一些随机的文件,那么在清理的过程可以找到这些随机创建的文件

    另一个方法是在执行清理的时候运行自己的代码

    创建一个 PropertyGroup 在里面添加自己的 target 名在 CleanDependsOn 里面,如下面代码将 Lindexi 添加到清理的依赖项

    <PropertyGroup>
        <CleanDependsOn>$(CleanDependsOn);Lindexi</CleanDependsOn>
    </PropertyGroup>

    将会在清理的时候,先执行添加的依赖项 Lindexi 的代码

    <Target Name="Lindexi">
        清理的代码
    </Target>

    让 MSBuild Target 支持 Clean - walterlv

    Microsoft.Common.CurrentVersion.targets

  • 相关阅读:
    完全数
    100c之29:求具有abcd= ( ab + cd )^2 性质的四位数
    完全数
    100c之22:计算车速
    100c之21:4位反序数
    100c之28:回文数
    AJAX
    网站运营十条定律 刚刚好
    QQ也流氓了 刚刚好
    服务器变肉鸡了 刚刚好
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086196.html
Copyright © 2011-2022 走看看