有没有办法在构建过程中动态添加嵌入式资源? 我目前正在使用 Ajax-Minifier 将两个文件减少为一个。 结果效果很好。 但是,当代码在发布模式下运行时,我需要将此文件作为嵌入式资源包含在内(当前由 if(!调试)
这是我在MSBUILD中使用的目标命令的简单版本
<Target Name="TestMinifiy" Condition=" '$(ConfigurationName)' == 'Release' ">
<ItemGroup>
<MyScript Include="..Test1.js" />
<MyScript Include="..Test2.js" />
</ItemGroup>
<AjaxMin JsSourceFiles="@(MyScript)" JsCombinedFileName="$(IntermediateOutputPath)Final.js" />
</Target>
所以基本上我想包含 Final.js 作为嵌入式资源,然后我可以在代码中引用。
从 C# 方面来看,这就是我要做的:
#if (!DEBUG)
[assembly: WebResource("Final.js", "text/javascript")]
#endif
任何帮助或想法将不胜感激。
编辑:
我已将 JsCombinedFileName 更改为 $(IntermediateOutputPath)\Final.js。 所以这应该创建文件。然后,我创建了一个单独的目标来嵌入此文件。
<Target Name="EmbedResource" Condition=" '$(ConfigurationName)' == 'Release' ">
<Message Text="Copying into Embedded..." Importance="high" />
<ItemGroup>
<EmbeddedResource Include="$(IntermediateOutputPath)Final.js" >
<LogicalName>
Final.js
</LogicalName>
</EmbeddedResource>
</ItemGroup>
</Target>
然而,仍然没有运气。
(更新以更好地回答问题。
我相信您遇到的问题是缩小是作为构建的一部分发生的,这意味着生成的最终.js文件在 TestMinify 目标中不可用。嵌入本身可以包含在这样的项目组中。
<Target Name="Build" Condition=" '$(ConfigurationName)' == 'Release' ">
<!-- other stuff -->
<ItemGroup>
<EmbeddedResource Include="final.js" />
<!-- other stuff -->
</ItemGroup>
</Target>
为了避免主构建目标中的重复,条件也可以像这样直接放置在EmbeddedResource
标记中。
<Target Name="Build">
<!-- other stuff -->
<ItemGroup>
<EmbeddedResource Condition=" '$(Configuration)' == 'Release' " Include="final.js" />
<!-- other stuff -->
</ItemGroup>
</Target>
然后,您可以在主Build
目标之前调用TestMinify
目标。
或者,您可以创建预生成事件来生成文件。它需要调用可执行文件而不是 MSBuild 任务。
下面是预生成事件的外观示例。
<PropertyGroup>
<PreBuildEvent>if "$(ConfigurationName)" equ "Release" (copy "$(ProjectDir)source.js" "$(ProjectDir)final.js")</PreBuildEvent>
</PropertyGroup>
在第二种方案中,可以通过前面提到的任一方式设置具有EmbeddedResource
的Build
目标。