从MSBuild发布中排除`.js`文件但不包括`.min.js`文件

5
使用Visual Studio和MSBuild,我希望能够在我的部署中排除所有的.js文件并包含所有的.min.js文件。
我知道可以使用Visual Studio中的文件属性来实现这一点,但由于文件太多,这不是一个选项。
我在我的Visual Studio项目中有以下的PublishProfile。除了<ItemGroup>之外,一切都运行得很好。
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <WebPublishMethod>FileSystem</WebPublishMethod>
        <LastUsedBuildConfiguration>Delpoy-Static</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
        <ExcludeApp_Data>True</ExcludeApp_Data>
        <publishUrl>\\***\wwwroot\***.com\static</publishUrl>
        <DeleteExistingFiles>False</DeleteExistingFiles>
    </PropertyGroup>
    <!--This does not work, but gives the idea of what I want to achieve-->
    <ItemGroup>
        <Deploy Exclude="**\*.js" Include="**\*.min.js" />
    </ItemGroup>
</Project>

这是否可以使用“PublishProfile”来实现?如果可以,怎样实现呢?

如果您需要的话,我可以帮您处理MSBuild,但是我建议您忽略使用http://blogs.msdn.com/b/webdev/archive/2013/08/22/web-publishing-a-simpler-way-to-exclude-files-folders-from-being-published.aspx。您能否看一下并告诉我是否仍需要MSBuild发布配置文件解决方案? - Sayed Ibrahim Hashimi
и°ўи°ўпјҢзңӢиө·жқҘеҫҲеҘҪпјҢжҲ‘еҸӘйңҖиҰҒеј„жё…жҘҡеҰӮдҪ•дҪҝз”ЁеҸҜз”Ёзҡ„иҜӯжі•еҝҪз•Ҙ.jsж–Ү件иҖҢдёҚжҳҜ.min.jsж–Ү件гҖӮеҸ‘еёғжҳҜеҗҰдёҘж јйҒөеҫӘ.gitignoreиҜӯжі•пјҹ - Blowsie
似乎出现了错误 Error MSB4018: "ReadPublishIgnoreFile" 任务意外失败。 System.NotSupportedException: 在 publish.ignore 中当前不支持 ! 运算符 at InlineCode.ReadPublishIgnoreFile.Execute() in c:\Users\sblowes\AppData\Local\Temp\bzp34wjd.0.cs:line 89 at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__20.MoveNext() - Blowsie
抱歉,我忘记了我从未实现对“!”的支持。我已经打开了一个问题来跟踪它 https://github.com/ligershark/publish-ignore/issues/8。我也在下面回答了。 - Sayed Ibrahim Hashimi
3个回答

10
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <!-- ... -->
  </PropertyGroup>

  <Target Name="BeforeBuild">
    <ItemGroup>
      <Minified Include="**\*.min.js" />
      <Maxified Include="**\*.js" Exclude="@(Minified)" />
      <Content Remove="@(Maxified)" />
    </ItemGroup>
  </Target>
</Project>

编辑:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <!-- ... -->
  </PropertyGroup>

  <ItemGroup>
    <Minified Include="**\*.min.js" />
    <Maxified Include="**\*.js" Exclude="@(Minified)" />
  </ItemGroup>
  <PropertyGroup>
    <ExcludeFoldersFromDeployment>bin</ExcludeFoldersFromDeployment>
    <ExcludeFilesFromDeployment>@(Maxified);Web.config</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

抱歉在赏金到期前我没有时间测试。我已经加倍赏金,并将在24小时内奖励。 - Blowsie
@Blowsie 奇怪,使用空的 Web 应用程序项目完全正常,没有部署 bin,只有 .min.js。你设置了 DeleteExistingFiles 吗?Exclude*FromDeployment 更好,不需要操纵事件,参见编辑。 - Ilya Kozhevnikov
更新后的示例抛出错误:“元素<Content>中的属性“Remove”未被识别”。 - Blowsie
@Blowsie,第二个非事件驱动的中没有Remove属性。 - Ilya Kozhevnikov
奖励问题。文件系统网站发布完成的目标是什么? - Blowsie
显示剩余5条评论

3

如果你想排除文件,可以将要排除的文件放在ExcludeFromPackageFiles项目组中。在您的情况下,您想要获取所有.js文件并排除除了那些*.min.js之外的所有文件。为此,请在.pubxml文件中添加以下内容。

  <ItemGroup>
    <ExcludeFromPackageFiles Include="js\**\*.js" Exclude="js\**\*min*.js">
      <FromTarget>Project</FromTarget>
    </ExcludeFromPackageFiles>
  </ItemGroup>

注意:此代码片段假定您的 .js 文件位于名为 js 的文件夹中。

谢谢,另外还有一个快速问题。在文件系统网络发布完成时是否有目标? - Blowsie
在使用VS 2015发布到Azure时,这仍然适用吗?我发现非最小化的js文件在推送到Azure之前创建的临时文件夹中,并且最终也被推送到Azure。我的项目的Js文件位于[solution folder][project folder]\wwwroot\js中。我尝试过路径,例如“wwwroot\js\”和“js\”。 - t.j.

0

对我来说需要做的工作:

  1. 编辑 .csproj 文件
  2. 找到 MinifyJavaScriptAndCSS 部分
  3. 编辑 JS 标签中的 Exclude 属性
  4. 添加要在发布过程中忽略的目录或文件
<Target Name="MinifyJavaScriptAndCSS" AfterTargets="CopyAllFilesToSingleFolderForPackage" Condition="'$(Configuration)'=='Release'">
    <ItemGroup>

      <!-- Every .js file (exclude *.min.js and *.vsdoc.js files) -->
      <JS Include="$(_PackageTempDir)\**\*.js" Exclude="$(_PackageTempDir)\**\*.min.js;$(_PackageTempDir)\**\*vsdoc.js;" />

      <CSS Include="$(_PackageTempDir)\**\*.css" Exclude="$(_PackageTempDir)\**\*.min.css" />
    </ItemGroup>
    <AjaxMin JsKnownGlobalNames="jQuery,$" JsSourceFiles="@(JS)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".js" CssSourceFiles="@(CSS)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".css" />
    <Message Text="[pcv] $(MSBuildProjectName) -&gt; Minified: @(JS)" Importance="high" />
    <Message Text="[pcv] $(MSBuildProjectName) -&gt; Minified: @(CSS)" Importance="high" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接