Use custom build output folder when using create-react-app

后端 未结 13 894
被撕碎了的回忆
被撕碎了的回忆 2020-12-04 17:24

Facebook provides a create-react-app command to build react apps. When we run npm run build, we see output in /build folder.

相关标签:
13条回答
  • 2020-12-04 17:49

    Edit your package.json:

    "build": "react-scripts build && mv build webapp"
    
    0 讨论(0)
  • 2020-12-04 17:52

    You can't change the build output folder name with the current configuration options.

    Moreover, you shouldn't. This is a part of the philosophy behind create-react-app: they say Convention over Configuration.

    If you really need to rename your folder, I see two options:

    1. Right after the build process finishes, write a command that copies the build folder content to another folder you want. For example you can try the copyfiles npm package, or anything similar.

    2. You could try to eject create-react-app and tweak the configuration.

      If you aren’t satisfied with the build tool and configuration choices, you can eject at any time. This command will remove the single build dependency from your project.

      Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except eject will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

      However, it is important to note that this is a one-way operation. Once you eject, you can’t go back! You loose all future updates.

    Therefore, I'd recommend you to not use a custom folder naming, if possible. Try to stick with the default naming. If not an option, try #1. If it still doesn't work for your specific use-case and you're really out of options - explore #2. Good luck!

    0 讨论(0)
  • 2020-12-04 17:53

    Windows Powershell Script

    //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"
    

    Running npm run postbuildNamingScript in powershell will move the JS files to build/new-folder-name and point to the new location from index.html.

    0 讨论(0)
  • Félix's answer is correct and upvoted, backed-up by Dan Abramov himself.

    But for those who would like to change the structure of the output itself (within the build folder), one can run post-build commands with the help of postbuild, which automatically runs after the build script defined in the package.json file.

    The example below changes it from static/ to user/static/, moving files and updating file references on relevant files (full gist here):

    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
    
    0 讨论(0)
  • 2020-12-04 18:01

    You can update the configuration with a little hack, under your root directory:

    1. npm run eject
    2. config/webpack.config.prod.js - line 61 - change path to: __dirname + './../--your directory of choice--'
    3. config/paths.js - line 68 - update to resolveApp('./--your directory of choice--')

    replace --your directory of choice-- with the folder directory you want it to build on

    note the path I provided can be a bit dirty, but this is all you need to do to modify the configuration.

    0 讨论(0)
  • 2020-12-04 18:02

    Based on the answers by Ben Carp and Wallace Sidhrée:

    This is what I use to copy my entire build folder to my wamp public folder.

    package.json

    {
      "name": "[your project name]",
      "homepage": "http://localhost/[your project name]/",
      "version": "0.0.1",
      [...]
      "scripts": {
        "build": "react-scripts build",
        "postbuild": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./post_build.ps1",
        [...]
      },
    }
    

    post_build.ps1

    Copy-Item "./build/*" -Destination "C:/wamp64/www/[your project name]" -Recurse -force
    

    The homepage line is only needed if you are deploying to a subfolder on your server (See This answer from another question).

    0 讨论(0)
提交回复
热议问题