5

我已将以下代码添加到我的 .csproj 以缩小在构建项目时更改的 JS 文件:

<Target Name="BeforeBuild">
  <MSBuild Targets="CheckAndMinifyJS" Projects="$(MSBuildProjectFile)" />
</Target>
<ItemGroup>
  <JS Include="$(ProjectDir)\**\*.js" />
</ItemGroup>
<Target Name="CheckAndMinifyJS" Inputs="@(JS)" Outputs="@(JS->'$(ProjectDir)%(RecursiveDir)%(Filename).min.js')">
  <AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" />
</Target>
<UsingTask TaskName="AjaxMin" AssemblyFile="..\..\ThirdParty\AjaxMinTask.dll" />

这很好用,但它有一个副作用:当您在 Visual Studio (2015) 中查看项目时,所有 JS 文件似乎都是重复的(相同的路径,但不同的构建操作):

重复项目

我想避免项目中出现带有“JS”构建操作的项目。我怎样才能做到这一点?

请注意,几个开发人员正在处理该项目,因此任何建议的解决方案都应包含在 .csproj 或解决方案中(例如:要求所有开发人员修改其注册表以更改 JS 文件的默认构建操作是不可接受的)。

4

1 回答 1

1

要从 Visual Studio 中隐藏您ItemGroup,请将其移动到中间的Target. 除了该更改之外,以下代码过滤现有Content项目,而不是再次递归文件系统。这可确保您不会拾取无关.js文件(例如 中的中间输出文件obj\,或.min.js由您的脚本生成但未明确添加到项目中的文件)。

  <Target Name="BeforeBuild">
    <MSBuild Targets="CheckAndMinifyJS" Projects="$(MSBuildProjectFile)" />
  </Target>
  <Target Name="GetJSItems" BeforeTargets="CheckAndMinifyJS">
    <ItemGroup>
      <JS Include="@(Content)" Condition=" '%(Extension)' == '.js' " />
    </ItemGroup>
  </Target>
  <Target Name="CheckAndMinifyJS" Inputs="@(JS)" Outputs="@(JS->'$(ProjectDir)%(RecursiveDir)%(Filename).min.js')">
    <AjaxMin JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" />
  </Target>
  <UsingTask TaskName="AjaxMin" AssemblyFile="..\..\ThirdParty\AjaxMinTask.dll" />
于 2017-01-12T17:57:35.217 回答