Vue CLI Дочерняя компиляция после первой сборки не удалась, если я не очистил папку .cache - PullRequest
0 голосов
/ 13 февраля 2019

Название вопроса говорит само за себя.

Я использую Vue CLI, и проект компилируется в первый раз.Но если я попытаюсь собрать его заново, произойдет сбой с этой ошибкой:

Error: Child compilation failed:
  Entry module not found: Error: Can't resolve 'C:\Users\Oliver\Workspace\academy-residences\public\index.html' in 'C:\Users\Oliver\Workspace\academy-residences':
  Error: Can't resolve 'C:\Users\Oliver\Workspace\academy-residences\public\index.html' in 'C:\Users\Oliver\Workspace\academy-residences'

  - compiler.js:79 childCompiler.runAsChild
    [academy-residences]/[html-webpack-plugin]/lib/compiler.js:79:16

  - Compiler.js:300 compile
    [academy-residences]/[webpack]/lib/Compiler.js:300:11

  - Compiler.js:556 hooks.afterCompile.callAsync.err
    [academy-residences]/[webpack]/lib/Compiler.js:556:14


  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [academy-residences]/[tapable]/lib/Hook.js:154:20

  - Compiler.js:553 compilation.seal.err
    [academy-residences]/[webpack]/lib/Compiler.js:553:30


  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [academy-residences]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1323 hooks.optimizeAssets.callAsync.err
    [academy-residences]/[webpack]/lib/Compilation.js:1323:35


  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [academy-residences]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1314 hooks.optimizeChunkAssets.callAsync.err
    [academy-residences]/[webpack]/lib/Compilation.js:1314:32


  - Hook.js:154 AsyncSeriesHook.lazyCompileHook
    [academy-residences]/[tapable]/lib/Hook.js:154:20

  - Compilation.js:1309 hooks.additionalAssets.callAsync.err
    [academy-residences]/[webpack]/lib/Compilation.js:1309:36



[copy-webpack-plugin] unable to locate 'C:\Users\Oliver\Workspace\academy-residences\public' at 'C:\Users\Oliver\Workspace\academy-residences\public'
 ERROR  Build failed with errors.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! academy-residences@0.1.0 watch: `vue-cli-service build --watch`
npm ERR! Exit status 1
npm ERR!

Однако, если я удаляю папку .cache в node_modules, она снова будет правильно построена!

Mypackage.json выглядит следующим образом:

{
  "name": "academy-residences",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "watch": "vue-cli-service build --watch",
    "test:unit": "vue-cli-service test:unit",
    "heroku-postbuild": "vue-cli-service build"
  },
  "dependencies": {
    "axios": "^0.18.0",
    "element-ui": "^2.4.5",
    "moment": "^2.24.0",
    "vue": "^2.5.21",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.3.0",
    "@vue/cli-plugin-unit-jest": "^3.3.0",
    "@vue/cli-service": "^3.3.0",
    "@vue/test-utils": "^1.0.0-beta.20",
    "babel-core": "7.0.0-bridge.0",
    "babel-jest": "^23.6.0",
    "node-sass": "^4.9.2",
    "sass-loader": "^7.0.3",
    "vue-cli-plugin-element": "^1.0.1",
    "vue-template-compiler": "^2.5.21"
  }
}

и вот мой vue.config

module.exports = {
    outputDir: './public',

    publicPath: process.env.NODE_ENV === 'production' ? '' : '',

    configureWebpack: {
        resolve: {
            alias: {
                '@': __dirname + '/ui/src'
            }
        },
        entry: {
            app: './ui/src/main.js'
        }
    }
};

package.json находится в корневой папке проекта со всем исходным кодом vue вui

root/
  ui/
    src/
  node_modules/
  package.json

Это недавняя проблема.На днях все работало нормально.Единственное, что, по-моему, могло вызвать это, - удалить @ vue / cli и переустановить его.

1 Ответ

0 голосов
/ 31 марта 2019

Это недавняя проблема.На днях все работало нормально.Единственное, что, по-моему, могло вызвать это, - удалить @ vue / cli и переустановить его.

Ну, вы правы в этом.До середины 2018 года у меня была структура папок, подобная

project
 ├── config
 ├── src // components, router, etc
 ├── static // images, robots.txt manifest, vendor css and whatnot
 ├── dist // not under version control, generated at deploy time
 └── index.html // entry point

. При создании проекта папка dist была очищена, затем фрагменты из src, где она была скомпилирована, затемстатические файлы в static копируются в dist (это может произойти до компиляции файлов src, что угодно).

Моя конфигурация выглядела так:

 new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, '../static'),
        to: config.build.assetsSubDirectory,
        ignore: ['.*']
      }
    ]),

Где config.build.assetsSubDirectoryбыло dist.

Перемотка вперед к текущему @ vue / cli (по состоянию на март 2019 г.), шаблон теперь использует webpack @ 4 вместо webpack @ 3, и некоторые значения по умолчанию изменились.В частности, они ожидают, что структура будет:

project
 ├── config
 ├── src 
 ├── public //  <── WHAIT!!! NO LONGER CALLED "static"
 |   └── index.html // <── NO LONGER IN ROOT
 └── dist

Таким образом, в вашей конфигурации объявление

module.exports = {
    outputDir: './public',
    ...
}

означает, что вы стираете public во время сборки, тогда веб-пакет не может скопировать вашу общедоступнуюактивы из источника ресурсов по умолчанию в выходную папку, которая стала такой же.

Теперь, если вы проверяете, что на самом деле делает веб-пакет (из корневой папки вашего проекта)

vuw inspect > output.js

или

$(npm bin)/vue-cli-service > output.js

Вы увидите, что у output.js есть блок в виде:

/* config.plugin('copy') */
new CopyWebpackPlugin(
  [
    {
      from: '/home/user/project/public',
      to: '/home/user/project/dist',
      toType: 'dir',
      ignore: [
        '.DS_Store'
      ]
    }
  ]
),

Если я изменил свой vue.config.js на, как у вас

outputDir: "./public",

Последняя команда выдаст раздел с текстом:

/* config.plugin('copy') */
new CopyWebpackPlugin(
  [
    {
      from: '/home/user/project/public',
      to: '/home/user/project/public',
      toType: 'dir',
      ignore: [
        '.DS_Store'
      ]
    }
  ]
),

Что, очевидно, не имеет никакого смысла

TL / DR;

Не использовать publicв качестве выходной папки или найдите способ изменить папку статических ресурсов, для чего, я полагаю, вам нужно вручную настроить CopyWebpackPlugin в вашем файле конфигурации vue.

...