Roslyn 如何使用 MSBuild Copy 复制文件
本文告诉大家如何在 MSBuild 里使用 Copy 复制文件
需要知道 Rosyln 是 MSBuild 的 dotnet core 版本。
在 MSBuild 里可以使用很多命令,本文告诉大家如何使用 Copy 这个 Task 来复制文件
在开始本文之前,希望大家已经知道了一些关于 csproj 文件格式,如果还是不知道,请看理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv
最简单的复制命令请看代码
<Copy SourceFiles="lindexi.txt" DestinationFolder="LetirNuhe\" ></Copy>
需要注意,不要把 Copy 直接写在 Project 下,如下面的代码
<Project Sdk="Microsoft.NET.Sdk">
<!-- 忽略代码 -->
<Copy SourceFiles="lindexi.txt" DestinationFolder="LetirNuhe\" ></Copy>
</Project>
就会出现下面异常
D:\林德熙\代码\测试代码\CemfeetoQewasXaiki\CemfeetoQewasXaiki.csproj : error : 无法识别元素 <Project> 下面的元素 <Copy>。 D:\林德熙\代码\测试代码\CemfeetoQewasXaiki
为了运行 Copy 需要使用下面代码
<Target Name="Copy" BeforeTargets="CoreCompile">
<Copy SourceFiles="LekeexelSurgooHerkassayyayTowjome.txt" DestinationFolder="LetirNuhe\"></Copy>
</Target>
需要知道 Target 需要给 Name 并且告诉他在什么时候运行,这里使用 BeforeTargets 告诉在开始编译前,也就是复制的文件会被编译。
对于复制资源文件或需要编译的资源,就设置 BeforeTargets 在编译前,如果是不需要进行编译的文件,如 dll 就可以设置在编译后运行。
重新生成项目,可以看到文件夹存在文件

如果刚才没有创建 文件,复制时找不到文件,就会出现在重新编译出现无法编译
error MSB3030: 无法复制文件“lindexi.txt”,原因是找不到该文件
复制有多个方式,下面让我来一个个和大家说
文件到文件
第一个方法是最简单的,复制文件到文件
例如我需要复制 lindiexi.txt 到 LetirNuhe\lindexi ,可以使用下面代码
<Target Name="Copy" BeforeTargets="CoreCompile">
<Copy SourceFiles="lindexi.txt" DestinationFiles="LetirNuhe\lindexi.txt"></Copy>
</Target>
那么如果需要复制多个文件到多个文件?
可以看到 SourceFiles 是可以输入多个文件,只需要使用;作为多个文件
下面复制 lindexi.txt 和 lindexi.gitee.io.txt 到 LetirNuhe 文件夹下
<Target Name="Copy" BeforeTargets="CoreCompile">
<Copy SourceFiles="lindexi.txt;lindexi.gitee.io.txt" DestinationFiles="LetirNuhe\lindexi.txt;LetirNuhe\lindexi.gitee.io.txt"></Copy>
</Target>
这里的文件是对应的,也就是第一个文件是 lindexi.txt在 DestinationFiles 也需要写第一个文件是lindexi.txt的,如果写为lindexi2.txt 会自动把 lindexi.txt 复制并且修改名字。第一个文件对应 DestinationFiles 写的第一个文件,也就是项对应。
因为从文件复制到文件的代码太多了,如果只是需要把文件都放在相同的文件夹,可以使用下面的方法
文件到文件夹
如果需要把文件都复制到相同的文件夹,可以使用下面代码
<Target Name="Copy" BeforeTargets="CoreCompile">
<Copy SourceFiles="lindexi.txt;lindexi.gitee.io.txt" DestinationFolder="LetirNuhe\"></Copy>
</Target>
使用 DestinationFolder 指定文件夹,在文件夹不存在的时候会自动创建,刚才的代码也是。
文件列表到文件夹
实际上刚才是写 SourceFiles ,但是实际这样写无法使用通配,也就是*.txt的方法,如果需要使用就需要用文件列表
<ItemGroup>
<Txt Include="*.txt"></Txt>
</ItemGroup>
<Target Name="Copy" BeforeTargets="CoreCompile">
<Copy SourceFiles="@(Txt)" DestinationFolder="LetirNuhe\"></Copy>
</Target>
多个文件的列表是在 ItemGroup 里添加 一个新的标签,这个标签是可以自己定义名字的,我这里定义了 Txt ,让他包含了 *.txt ,现在就可以在 SourceFiles 使用。使用数组的方法是 @(Txt) ,通过 @ 和 标签名就可以拿到标签的文件。如果这时输出@(Txt) 会看到下面代码
xx\lindexi.txt;xx\lindexi.gitee.io.txt
因为 ItemGroup 可以写多个标签,可以修改下面代码
<ItemGroup>
<Txt Include="lindexi.txt"></Txt>
<Txt Include="lindexi.gitee.io.txt"></Txt>
</ItemGroup>
<Target Name="Copy" BeforeTargets="CoreCompile">
<Copy SourceFiles="@(Txt)" DestinationFolder="LetirNuhe\"></Copy>
</Target>
较新才复制
如果不想每次编译都复制,可以设置SkipUnchangedFiles="True" 只有在发现文件较新才复制。
判断文件较新使用的是判断两个文件的最后更改时间和文件大小。
软连接
可以通过设置 UseHardlinksIfPossible="True"不复制文件,而是设置文件的软连接,也就是修改一个文件可以两个地方生效
设置软连接可以做到在多个项目看起来都有自己的文件,但是实际都是指向相同的文件
需要说的是,这个是软连接,但是在系统是硬连接方式。
判断文件存在就不复制
如果需要判断文件存在就不复制,可以使用 Condition 判断
<Copy SourceFiles="@(Txt)" DestinationFolder="LetirNuhe\" SkipUnchangedFiles="True" OverwriteReadOnlyFiles="True" Condition="!Exists('LetirNuhe\lindexi.txt')"></Copy>
通过 Exists 判断文件是否存在,如果存在就不复制。
更多 MSBuild 相关博客请看
理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv
如何创建一个基于命令行工具的跨平台的 NuGet 工具包 - walterlv
如何使用 MSBuild Target(Exec)中的控制台输出 - walterlv
更多关于 Roslyn 请看 手把手教你写 Roslyn 修改编译
我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
Roslyn 如何使用 MSBuild Copy 复制文件的更多相关文章
- TDirectory.Copy复制文件
描述:复制文件夹以及文件夹下的内容 procedure Copy(const SourceDirName, DestDirName: string) 参数一:源文件夹 参数二:目标文件夹 所在单元:S ...
- Linux命令:cp (copy)复制文件或目录
复制文件,只有源文件较目的文件的修改时间新时,才复制文件 cp -u -v file1 file2 .将文件file1复制成文件file2 cp file1 file2 .采用交互方式 ...
- php不使用copy()函数复制文件的方法
本文实例讲述了php不使用copy()函数复制文件的方法.分享给大家供大家参考.具体如下:下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方式复制文件 <?php funct ...
- copy and Xcopy 复制文件到另一地址
1. copy不能复制文件夹下的文件,而Xcopy可以. 2. Xcopy不能连接文件,而copy可以连接文件 eg : 将A盘中的A.TXT和B.TXT文件连接起来,连接后的文件名为C.TXT ...
- asp.net 文件复制或删除用相对路径,File.Copy中用相对路径,巧用相对路径复制文件
再复制文件 File.Copy(Server.MapPath("被复制的文件相对路径"), Server.MapPath("目的位置相对路径"), true); ...
- 用copy只能复制文件,用xcopy却说参数错误?
dos里面没有复制文件夹这一个命令,这是个复合的命令,是由新建文件夹和将原文件夹里的东西全部复制进去两步组成的.就像剪贴一样,是先建立文件,然后再删除源文件.这是一种复合型的操作. 复制文件夹: 1. ...
- c# 复制整个文件夹的内容,Copy所有文件
/// <summary> /// 文件夹下所有内容copy /// </summary> /// <param name="SourcePath"& ...
- cmd copy命令 文件复制【转】
本文转载自:https://www.jb51.net/article/18981.htm copy,中文含义为“复制”,一个很容易见名知意的命令,它的作用是复制文件,用法十分简单:copy 源文件 目 ...
- JAVA实现复制文件夹
package com.filetest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
随机推荐
- 2018-8-15-WPF-插拔触摸设备触摸失效
title author date CreateTime categories WPF 插拔触摸设备触摸失效 lindexi 2018-08-15 08:12:47 +0800 2018-08-09 ...
- 【转载】【技巧总结】PyCharm怎么克隆github上开源的项目
PyCharm怎么clone github上开源的项目 一.先要确保PyCharm正确的配置了Git 如果你已经在PyCharm中配置好了Git,可以跳过此步骤,直接看下一步. 那么怎么在Py ...
- Spring_自动组件扫描和 基于注解配置bean
自动组件扫描 启用Spring组件扫描功能. 使用@Component注释来表示这是类是一个自动扫描组件. package com.tanlei.dao; import org.springfram ...
- Python的bisect模块
Python的列表(list)类型内部是一个线性表,在线性表中查找元素复杂度为O(N),即调用list.index()的复杂的是O(N).当数据量较大时,应该使用二分查找优化,二分查找范围每次缩小一般 ...
- 【JZOJ4762】【NOIP2016提高A组模拟9.7】千帆渡
题目描述 输入 输出 样例输入 5 1 4 2 5 1 4 1 1 2 4 样例输出 2 1 4 数据范围 解法 设f[i][j]表示前 i个蓝色帆船中,选择了第 j个红色帆船作为结尾的最大答案. 那 ...
- hackerrank---Find a string
题目链接 在字符串a中查找字符串b出现的次数...貌似不可以用a.count() 附上代码: a = raw_input().strip() b = raw_input().strip() cnt = ...
- 微信小程序开发资源整理
有兴趣学习微信小程序开发的可以关注简书专题 微信小程序开发 由于微信已经开发文档和开发工具了,所以下面的内容用处不大了. 具体参考:http://mp.weixin.qq.com/wiki/ 这篇文章 ...
- [React Native]获取网络状态
使用React Native,可以使用NetInfo API获取手机当前的各个网络状态. componentWillMount() { NetInfo.fetch().done((status)=&g ...
- iPhone 7 Plus 维修记 (一)(2019-08-07)
iPhone 7 Plus 维修记 问题 电池鼓包,屏幕已经被撑起,偶尔死机突然关机. 分析 初步分析是电池损坏. 维修 由于电池没有双易拉条需要将后壳加热后再取出电池. 更换电池后测试,发现电量一会 ...
- typeof操作符,返回数据类型Array.isArray()、Object.prototype.toString.call()
源地址https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof typeof操作符 // N ...