如何让Visual Studio发布功能遵循"Copy if Newer"文件复制设置?
解决方案
以下三个方案均可满足需求,可根据项目实际情况选择:
方案1:修改发布配置仅针对NLog.config做覆盖判断
无需调整项目结构,是适配性最高的方案:
- 打开对应发布任务的
.pubxml配置文件,默认存放路径为项目的Properties\PublishProfiles目录 - 在文件末尾的
</Project>标签前,添加如下自定义MSBuild规则:
<Target Name="SkipExistingNLogConfigWhenPublish" BeforeTargets="CopyAllFilesToSingleFolderForMsdeploy"> <ItemGroup> <!-- 发布目录已存在NLog.config时,将默认配置从待复制文件列表中移除 --> <FilesForPackagingFromProject Remove="NLog.config" Condition="Exists('$(PublishDir)\NLog.config')" /> </ItemGroup> </Target>
- 保存配置后重新发布即可生效,发布时会自动判断:目标目录无文件则复制默认版本,已有文件则跳过覆盖。
方案2:拆分NLog配置从根源避免覆盖冲突
该方案不需要修改发布逻辑,也能满足配置隔离需求:
- 修改源码中存放的
NLog.config为基础默认配置,仅保留输出日志到文件的兜底规则 - 在
NLog.config的<nlog>根节点内添加环境配置引入规则:
<include file="NLog.Prod.config" optional="true" />
- 生产环境的专属配置全部写入
NLog.Prod.config,该文件不需要提交到Git,也不存在于源码中,发布时永远不会被覆盖。如果环境中没有该文件,NLog会自动使用默认基础配置运行。
方案3:通过生成事件自定义复制逻辑
如果习惯用生成事件控制文件复制,可按如下步骤操作:
- 将项目中
NLog.config的复制到输出目录属性修改为不复制 - 打开项目属性→生成事件→生成后事件命令行,添加:
if not exist "$(TargetDir)\NLog.config" copy "$(ProjectDir)\NLog.config" "$(TargetDir)\NLog.config"
- 打开对应发布配置的
.pubxml文件,添加前置发布任务:
<Target Name="CopyDefaultNLogConfigIfNotExist" BeforeTargets="MSDeployPublish"> <Exec Condition="!Exists('$(PublishDir)\NLog.config')" Command="copy $(ProjectDir)\NLog.config $(PublishDir)\NLog.config" /> </Target>
内容的提问来源于stack exchange,提问作者gaazkam
相关产品推荐
相关产品推荐

