自定义MSBuild任务新增文件被VS自动移除问题求助
自定义MSBuild脚本打包任务的自动排除问题
问题背景
我编写了一个用于将多个独立JavaScript文件打包为单个文件的自定义MSBuild任务,项目csproj中的配置如下:
<ItemGroup> <ScriptBundler Include="**\*.js" Exclude="app.js" /> </ItemGroup>
自定义构建任务接收文件输入的代码:
[Required] public ITaskItem[] Files { get; set; }
任务在构建流程中的配置:
<Target Name="BeforeBuild"> <BundleScripts Files="@(ScriptBundle)" ProjectDirectory="$(MSBuildProjectDirectory)" /> </Target>
问题现象
每当添加符合Include="**\*.js"路径规则的新文件(如myNewFile.js),Visual Studio会自动在csproj中添加以下代码:
<ScriptBundler Remove="myNewFile.js" />
这会导致新脚本无法被正确打包,每次排查都要花费近一小时。
解决办法
修改ItemGroup配置,阻止自动生成Remove项
在ItemGroup中给ScriptBundler添加<Visible>false</Visible>属性,告诉Visual Studio不要跟踪该集合的文件状态,避免自动添加Remove条目:<ItemGroup> <ScriptBundler Include="**\*.js" Exclude="app.js"> <Visible>false</Visible> </ScriptBundler> </ItemGroup>在Target中动态获取文件,绕过ItemGroup跟踪
直接在BeforeBuildTarget里动态扫描符合规则的文件,不依赖预定义的ItemGroup,每次构建都会重新获取最新文件列表:<Target Name="BeforeBuild"> <ItemGroup> <ScriptFiles Include="**\*.js" Exclude="app.js" /> </ItemGroup> <BundleScripts Files="@(ScriptFiles)" ProjectDirectory="$(MSBuildProjectDirectory)" /> </Target>全局禁用VS自动文件管理(谨慎使用)
在csproj的PropertyGroup中添加配置,全局禁用Visual Studio的默认文件自动包含/排除行为,但此设置会影响项目中所有文件的管理:<PropertyGroup> <EnableDefaultItems>false</EnableDefaultItems> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Kyle B
相关产品推荐
相关产品推荐

