如何解决 MSBuild 抛出错误 MSB3030:无法复制文件 "Scripts\dist\main.bundle.js" 因为找不到

How to resolve MSBuild throws Error MSB3030: Could not copy the file "Scripts\dist\main.bundle.js" because it was not found

Azure Pipeline 项目有两个生成代理

  1. 构建 Angular 项目。

构建成功,资产、chunk.js 文件和 bundle.js 文件作为工件发布

  1. 构建 ASP.net Web 应用程序。

我从以前的构建代理下载工件并将它们解压缩到 $(build.stagingDirectory)/Scripts/dist 目录中,因为它们将被 ASP.net项目。

我的提取文件 任务 ymal 是

steps:
- task: ExtractFiles@1
  displayName: 'Extract files bundle.zip'
  inputs:
    archiveFilePatterns: '$(Pipeline.Workspace)/dist/$(Build.BuildId)_bundle.zip'
    destinationFolder: '$(build.sourcesDirectory)/Scripts/dist' 

MSBuild 构建 ASP.net 项目时,无法找到 ##[error]C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets(182,5): Error MSB3030: Could not copy the file "Scripts\dist\main.bundle.js" because it was not found.

MS 构建 yaml 是:

steps:
- task: MSBuild@1
  displayName: 'Build solution NMG.Portal.MVCForAngular'
  inputs:
    solution: NMG.WebApp.MVCForAngular/NMG.WebApp.MVCForAngular.csproj
    msbuildArguments: '/p:ProjectFile=$(build.sourcesDirectory)\NMG.WebApp.MVCForAngular\NMG.WebApp.MVCForAngular.csproj /p:DeployOnBuild=true /p:SkipInvalidConfigurations=true /p:OutDir="$(build.stagingDirectory)\"'
    clean: false
    logProjectEvents: true
    createLogFile: true

我的 ASP.NET BundleConfig.cs 文件有下面的代码。

public class BundleConfig
    {
        // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));
            // Use the development version of Modernizr to develop with and learn from. Then, when you're
            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

            bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                      "~/Scripts/bootstrap.js",
                      "~/Scripts/respond.js"));

            bundles.Add(new StyleBundle("~/Content/css").Include(
                      "~/Content/bootstrap.css",
                      "~/Content/site.css"));

            bundles.Add(new ScriptBundle("~/bundles/nmg").Include(
                "~/Scripts/dist/inline*",
                "~/Scripts/dist/polyfills*",
                "~/Scripts/dist/scripts*",
                "~/Scripts/dist/vendor*",
                "~/Scripts/dist/main*"));

            bundles.Add(new StyleBundle("~/Content/nmg").Include(
                 "~/Scripts/dist/styles*"));
        }
    }

从逻辑上讲,这应该可行。

我想知道这里缺少什么?为什么 MSBuild 找不到我在 Scripts/dist.

中提取的包

复制到 Scripts/dist 文件夹的 main.bundle.js 是 main.7515c53aa0f2ef625908.bundle.js 但 MSBuild 不考虑它。

同意Thangadurai,这可能是一个与路径相关的问题。

勾选$(build.sourcesDirectory)/Scripts/dist$(build.sourcesDirectory)一般代表解决方案目录。所以现在你的文件结构是这样的:

`$(build.sourcesDirectory)`(sln directory)
    |
    Scripts
    |    |
    |    ----dist
    |           |
    |            ----main.xxx.bundle.js
    |       
    xx.sln
    |
    NMG.WebApp.MVCForAngular
         |
         NMG.WebApp.MVCForAngular.csproj
         |
         Scripts

提取出来的main.xx.js放在Solution目录下的Script文件夹中,但是当msbuild + NMG.WebApp.MVCForAngular.csproj.

时,msbuild会在Project目录下搜索Script文件夹

另外:建议你检查NMG.WebApp.MVCForAngular.csproj的内容中是否存在对Scripts\dist\main.bundle.js的引用,如果存在,你还需要确保提取的文件名与项目文件中的引用完全匹配。

Ms​​build 不会将 main.7515c53aa0f2ef625908.bundle.jsmain.bundle.js 视为同一个,因此如果提取文件的名称与项目文件中的引用不匹配,您也会收到该错误。

实际问题是,当 MSBuild 创建发布文件时,它会根据构建定义复制文件。我如下编辑了 .csproj 文件,复制了相关文件。

<Content Include="assets\i18n\**" />    
<Content Include="Scripts\dist\*.bundle.js" />
<Content Include="Scripts\dist\*.bundle.css" />
<Content Include="*.chunk.js" />

这是可能的,因为在 MSBuild 任务之前,我确实将 angular 文件复制到相关文件夹。