Использовать пользовательскую папку вывода сборки при использовании приложения create-response-app

Facebook предоставляет create-react-app команду для создания приложений реагирования. Когда мы запускаем npm run build, мы видим вывод в папке /build.

npm запустить сборку

Создает приложение для производства в папку сборки. Он правильно связывает React в производственном режиме и оптимизирует сборку для достижения максимальной производительности.

Сборка минифицирована, а имена файлов включают хеши. Ваше приложение готово к развертыванию!

Как мы можем использовать пользовательскую папку вместо /build для вывода? Спасибо.


person 6324    schedule 05.01.2017    source источник
comment
см. этот вопрос и попробуйте заменить "build" на "something". Не пробовал.   -  person nikrb    schedule 03.02.2018
comment
теперь это официально поддерживается, прокрутите вниз до stackoverflow.com/a/62378644/214446   -  person mb21    schedule 10.04.2021


Ответы (16)


Вы не можете изменить имя выходной папки сборки с текущими параметрами конфигурации.

Более того, не стоит. Это часть философии, лежащей в основе create-react-app: они говорят: Соглашение окончено Конфигурация.

Если вам действительно нужно переименовать папку, я вижу два варианта:

  1. Сразу после завершения процесса сборки напишите команду, которая копирует содержимое папки сборки в другую папку, которую вы хотите. Например, вы можете попробовать copyfiles пакет npm или что-нибудь подобное.

  2. # P5 #
    # P6 # # P7 #
    # P8 #

Поэтому я бы рекомендовал вам по возможности не использовать произвольное именование папок. Постарайтесь придерживаться именования по умолчанию. Если нет, попробуйте №1. Если это по-прежнему не работает для вашего конкретного варианта использования, и у вас действительно нет вариантов - исследуйте # 2. Удачи!

person Kaloyan Kosev    schedule 05.01.2017
comment
какое преимущество будет иметь копирование файлов перед переименованием папки? - person azium; 06.01.2017
comment
Меня больше всего беспокоило то, что это может вызвать проблемы, если какие-либо другие команды react-create-app используют папку /build для ввода. (пример: в процессе развертывания). Так что копирование - самый безопасный вариант, который я вижу. PS: Если нет планов использовать папку /build по умолчанию для ввода, я согласен с вами - простое ее переименование приведет к тому же результату. - person Kaloyan Kosev; 06.01.2017
comment
Мне то же. Я бы хотел, чтобы моя папка сборки переместилась в другое место, чтобы я мог создать образ Docker без всякого другого мусора в корневой папке, который нужно было исключить из контекста докера. - person Ray Booysen; 04.07.2019
comment
Проблема с соглашением по конфигурации заключается в том, что у вас есть несколько соглашений о конфликтах. IE мы используем react внутри приложения angular. Таким образом, только окончательная сборка должна входить в сборку, а реакция создает только промежуточные файлы. - person paul23; 21.09.2020
comment
Это приземлилось с версией v4.0.2. Рабочий пример: stackoverflow.com/a/66036117/6774916 - person t_dom93; 22.02.2021
comment
Соглашение важнее конфигурации не означает негибкость. - person Reactgular; 26.06.2021
comment
Они поняли, что «Соглашение вместо конфигурации» недостаточно хорошо, и реализовали его на v4.0.2 - person Coal; 21.07.2021

Отредактируйте свой package.json:

"build": "react-scripts build && mv build webapp"
person Félix    schedule 14.06.2017
comment
Мне пришлось сделать это "build": "react-scripts build && rm -rf docs && mv build docs", иначе после первого запуска сборка перемещается в папку docs, а не перезаписывается. - person TimoSolo; 01.02.2018
comment
Эквивалентные команды для Windows rm -rf webapp = DEL /S /Q webapp и mv build webapp = move build webapp - person Taha Farooqui; 02.10.2020
comment
Если вы не хотите перемещать папку сборки, просто скопируйте ее файлы. эквивалент команд для Windows: mv build webapp = xcopy /E /H /C /I build webapp - person Taha Farooqui; 02.10.2020
comment
Если вы хотите перенести что-то внутри build на webapp, а не на webapp / build, команды для Windows: "build": "react-scripts build && RMDIR /S /Q webapp && move build webapp" - person Sergio Gutiérrez; 06.10.2020
comment
Чтобы он работал на разных платформах (включая Windows), сначала установите пакет npm под названием cross-env используя npm i --save-dev cross-env. А затем в вашем package.json: "build": "cross-env react-scripts build && mv build webapp" - person Nikhil Sinha; 16.10.2020

Ответ Create-react-app версии 2+

Для последних (> v2) версий create-response-app (а также, возможно, более старых) добавьте следующую строку в свой package.json, а затем перестройте.

"homepage": "./"

Теперь вы должны увидеть, что build / index.html будет иметь относительные ссылки ./static/... вместо ссылок на корень сервера: /static/....

person Malcolm Dwyer    schedule 20.11.2018
comment
Спасибо. Это должен быть принятый ответ. VS Code предупредит вас, если вы не используете абсолютный URL-адрес, но сборка также работает с относительными URL-адресами. - person Hari; 15.05.2019
comment
Это именно то, что я искал. Спасибо - person Jesus; 21.04.2020

С react-scripts >= 4.0.2 это официально поддерживается:

По умолчанию приложение Create React выводит скомпилированные ресурсы в каталог /build, расположенный рядом с /src. Вы можете использовать эту переменную, чтобы указать новый путь для приложения Create React для вывода ресурсов. BUILD_PATH следует указывать как путь относительно корня вашего проекта.

// package.json
  "scripts": {
    "build": "BUILD_PATH='./dist' react-scripts build",
    // ...
  },

или добавив файл .env в корень вашего проекта:

# .env
BUILD_PATH='./dist'
person Andrew H.    schedule 14.06.2020
comment
Я надеюсь, что он попадет! Очень досадно, что они отказываются его поддерживать. - person Will Farley; 11.11.2020
comment
Эта конфигурация была опубликована сегодня с версией 4.0.2, она находится в документации по расширенной конфигурации и в журнале изменений. - person Ahmed Mohamedeen; 03.02.2021
comment
Это отличное решение! Важное предупреждение При написании BUILD_PATH убедитесь, что указанный вами путь не существует или вы не возражаете, чтобы его стерли. Выполнение BUILD_PATH='..' нанесло серьезный ущерб прогрессу, достигнутому мною в моем проекте. (Он также удалил git.) - person barshopen; 25.04.2021

Поддержка BUILD_PATH только что появилась в v4.0.2.

Добавьте переменную BUILD_PATH в .env файл и выполните команду сценария build:

// .env file
BUILD_PATH=foo 

Это должно поместить все файлы сборки в папку foo.

person t_dom93    schedule 03.02.2021
comment
Блестяще. Работал, как ожидалось, с BUILD_PATH = .. / dist - person Ahack; 11.02.2021

Ответ Феликса правильный, он получил одобрение и поддержан самим Дэном Абрамовым < / а>.

Но для тех, кто хотел бы изменить структуру самого вывода (в папке build), можно запускать команды после сборки с помощью postbuild, который автоматически запускается после сценария build, определенного в файле package.json.

Пример ниже меняет его с static/ на user/static/, перемещая файлы и обновляя ссылки на файлы в соответствующих файлах (здесь полностью ):

package.json

{
  "name": "your-project",
  "version": "0.0.1",
  [...]
  "scripts": {
    "build": "react-scripts build",
    "postbuild": "./postbuild.sh",
    [...]
  },
}

postbuild.sh

#!/bin/bash

# The purpose of this script is to do things with files generated by
# 'create-react-app' after 'build' is run.
# 1. Move files to a new directory called 'user'
#    The resulting structure is 'build/user/static/<etc>'
# 2. Update reference on generated files from
#    static/<etc>
#     to
#    user/static/<etc>
#
# More details on: https://github.com/facebook/create-react-app/issues/3824

# Browse into './build/' directory
cd build
# Create './user/' directory
echo '1/4 Create "user" directory'
mkdir user
# Find all files, excluding (through 'grep'):
# - '.',
# - the newly created directory './user/'
# - all content for the directory'./static/'
# Move all matches to the directory './user/'
echo '2/4 Move relevant files'
find . | grep -Ev '^.$|^.\/user$|^.\/static\/.+' | xargs -I{} mv -v {} user
# Browse into './user/' directory
cd user
# Find all files within the folder (not subfolders)
# Replace string 'static/' with 'user/static/' on all files that match the 'find'
# ('sed' requires one to create backup files on OSX, so we do that)
echo '3/4 Replace file references'
find . -type f -maxdepth 1 | LC_ALL=C xargs -I{} sed -i.backup -e 's,static/,user/static/,g' {}
# Delete '*.backup' files created in the last process
echo '4/4 Clean up'
find . -name '*.backup' -type f -delete
# Done
person Wallace Sidhrée    schedule 13.08.2018
comment
postbuild: postbuild.sh (без ./) работал у меня, по крайней мере, в окнах - person x7BiT; 15.06.2020
comment
Жалко, что вы должны топтать build, а затем переместить / переименовать его. - person Greg K; 02.10.2020

У меня был сценарий, например, я хотел переименовать папку и изменить место вывода сборки, и я использовал приведенный ниже код в package.json с последней версией.

"build": "react-scripts build && mv build ../my_bundles"
person Jaison James    schedule 14.11.2018
comment
это очень полезно при копировании содержимого build в docs dir для хостинга со страницами github, в конечном итоге "build-docs": "react-scripts build && cp -r build/** docs" - person ipatch; 17.05.2020


Скрипт сборки быстрой совместимости (также работает в Windows):

"build": "react-scripts build && rm -rf docs && mv build docs"
person Sagar Ghimire    schedule 13.03.2020

Для тех, кто все еще ищет ответ, который работает как в Linux, так и в Windows:

Добавьте это в раздел scripts в package.json

"build": "react-scripts build && mv build ../docs || move build ../docs",

с ../docs - это относительная папка, в которую вы хотите переместить папку сборки

person Tuan Tran    schedule 19.05.2020

Скрипт Windows Powershell

//package.json
"scripts": {
    "postbuildNamingScript": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./powerShellPostBuildScript.ps1",


// powerShellPostBuildScript.ps1
move build/static/js build/new-folder-name 
(Get-Content build/index.html).replace('static/js', 'new-folder-name') | Set-Content 
build/index.html
"Finished Running BuildScript"

Запуск npm run postbuildNamingScript в PowerShell переместит файлы JS в build/new-folder-name и укажет на новое местоположение из index.html.

person Ben Carp    schedule 24.04.2019

Команда перемещения для окон у меня не работала. Потому что он не копирует статические папки и подпапки. Так что я смог решить эту проблему с помощью ROBOCOPY.

"build": "react-scripts build && ROBOCOPY build ../my-relative-path/react-app /E",
person Muhammet Can TONBUL    schedule 16.05.2021

Вот мое решение: создайте .env в корне, а затем добавьте к нему эту строку.

BUILD_PATH=$npm_package_name-$npm_package_version

путь сборки будет name_of_app-version

эти значения могут быть установлены в package.json

{
  "name": "my-app",
  "version": "0.1.2",
...
}
person Mahdi Mohammadi Zadeh    schedule 16.06.2021

Откройте командную строку в исходном коде вашего приложения. Запустите команду

npm запустить выброс

Откройте файл scripts / build.js и добавьте его в начало файла после строки use strict.

'use strict';
....
process.env.PUBLIC_URL = './' 
// Provide the current path
.....

введите здесь описание изображения

Откройте файл config / paths.js и измените свойство buildApp в объекте экспорта в папку назначения. (Здесь я указываю 'response-app-scss' в качестве папки назначения)

module.exports = {
.....
appBuild: resolveApp('build/react-app-scss'),
.....
}

введите здесь описание изображения

Запустить

npm запустить сборку

Примечание. Запускать скрипты, зависящие от платформы, не рекомендуется

person Vignesh M    schedule 06.09.2019

Вы можете обновить конфигурацию с помощью небольшого взлома в корневом каталоге:

  1. npm запустить выброс
  2. config / webpack.config.prod.js - строка 61 - измените путь на: __dirname + './../ - выбранный вами каталог -'
  3. config / paths.js - строка 68 - обновить до resolveApp ('./ - выбранный вами каталог -')

замените --ваш каталог по выбору - на каталог, в котором вы хотите его создать.

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

person Jerry Lin    schedule 27.04.2017

webpack =>

переименован в build to dist

output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist'),
    },
person Anupam Maurya    schedule 09.01.2020