单文件发布如何排除单个.yml文件?配置后仍被打包进exe
.NET单文件发布排除指定yml文件的正确配置方法
你之前配置不生效的核心原因是:.yml后缀的文件默认不会被.NET SDK识别为Content类型的项,你用Content Update的写法前提是目标文件已经被归类为Content类型,匹配不到文件的话配置自然完全不会生效。
按下面的步骤操作即可:
- 先把csproj文件里所有和
config.yml相关的旧配置条目全部删掉,避免多份配置冲突 - 选择下面任意一种方式配置即可:
- 直接编辑csproj文件,加入如下条目。注意如果你的yml文件放在项目子目录里,要把相对路径写对,比如放在
Configs文件夹下就写Configs/config.yml
<ItemGroup> <None Include="config.yml" CopyToPublishDirectory="PreserveNewest" ExcludeFromSingleFile="true" /> </ItemGroup>- 在Visual Studio里右键点击项目中的
config.yml文件,打开属性面板,直接设置三个属性:- 生成操作:无
- 复制到发布目录:如果较新则复制
- 排除在单文件外:是
- 直接编辑csproj文件,加入如下条目。注意如果你的yml文件放在项目子目录里,要把相对路径写对,比如放在
几个需要注意的坑:
- 不要用
CopyToOutputDirectory配置发布行为,这个属性仅影响本地build生成的输出目录,不控制publish单文件打包的逻辑,发布流程只识别CopyToPublishDirectory属性 - 不要把
CopyToPublishDirectory的值设为true,合法值只有PreserveNewest、Always、Never,写错值会导致配置被忽略 - 如果csproj里全局设置了
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>,需要删掉这个全局配置,否则所有文件都会被强制打包进单文件,单个文件的排除配置不会生效
如果配置完还是不生效,可以用详细日志模式执行发布排查问题,命令如下:
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true -v:detailed
在输出日志里搜索config.yml,就能看到这个文件在发布流程里被识别到的所有属性,确认ExcludeFromSingleFile是否为true即可定位问题。
内容的提问来源于stack exchange,提问作者SeismicWaves
相关产品推荐
相关产品推荐

