├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── CONTRIBUTING.md ├── DevelopmentContainers.md ├── Dockerfile ├── LICENSE ├── README.md └── assets ├── VScorner.png ├── github-code.png ├── github-create-space.png ├── github-open-vs-confirm.png ├── github-open-vs.png ├── vs-containers-selector.png ├── vs-files.png ├── vs-log.png └── vs-ports.png /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Run '...' 16 | 1. See error 17 | 18 | **Expected behavior** 19 | A clear and concise description of what you expected to happen. 20 | 21 | **Screenshots** 22 | If applicable, add screenshots to help explain your problem. 23 | 24 | **Desktop (please complete the following information):** 25 | - OS: [e.g. Windows, macOS, Linux, WSL] 26 | - Shell [e.g. PowerShell, Bash] 27 | - Image version [e.g. 1.13.1] 28 | 29 | **Additional context** 30 | Add any other context about the problem here. 31 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution guidelines 2 | 3 | We appreciate that you're interested in helping with moving the project forward. Before you submit your first PR, please read the following guide. We'd hate to see you work on something that someone else is already working on, something that we agreed not to do or something that doesn't match the project. 4 | 5 | Sharing is caring! 6 | 7 | ## You have an idea for an improvement/feature 8 | 9 | Awesome! Good ideas are invaluable for every project. Before you start hacking away, please check if there is no similar idea already listed in the [issue list](https://github.com/pnp/docker-spfx/issues). If not, please create a new issue describing your idea. Once we agree on the feature scope and architecture, the feature will be ready for building. Don't hesitate to mention in the issue if you'd like to build the feature yourself. 10 | 11 | ## You've found a bug 12 | 13 | Bugs happen. When you find a bug, please have a look at the [issue list](https://github.com/pnp/docker-spfx/issues) if a similar bug has already been logged. If not, let us know what doesn't work and how we can reproduce it. If we can't reproduce your bug, we will ask you for clarification, which will only make it longer to fix it. 14 | 15 | ## Fixing typos 16 | 17 | Typos are embarrassing! Most PR's that fix typos will be accepted immediately. In order to make it easier to review the PR, please narrow the focus instead of sending a huge PR of fixes. 18 | 19 | ## Tips 20 | 21 | Before contributing: 22 | 23 | - ensure that the **main** branch on your fork is in sync with the original **docker-spfx** repository 24 | 25 | ```sh 26 | # assuming you are in the folder of your locally cloned fork.... 27 | git checkout main 28 | 29 | # assuming you have a remote named `upstream` pointing to the official **docker-spfx** repo 30 | git fetch upstream 31 | 32 | # update your local main to be a mirror of what's in the main repo 33 | git pull --rebase upstream main 34 | ``` 35 | 36 | - create a feature branch for your change. If you'll get stuck on an issue or merging your PR will take a while, this will allow you to have a clean main branch that you can use for contributing other changes 37 | 38 | ```sh 39 | git checkout -b my-contribution 40 | ``` 41 | 42 | ## DO's & DON'Ts 43 | 44 | - **DO** follow the same structure as the existing project. 45 | - **DO** keep discussions focused. When a new or related topic comes up it's often better to create new issue than to side track the conversation. 46 | - **DO NOT** submit PR's for coding style changes. 47 | - **DO NOT** surprise us with PR's. Instead file an issue & start a discussion so we can agree on a direction before you invest a large amount of time. 48 | - **DO NOT** commit code you didn't write. 49 | - **DO NOT** submit PR's that refactor existing code without a discussion first. 50 | 51 | ## Debugging locally 52 | 53 | ### Building from Dockerfile 54 | 55 | ```sh 56 | docker build --platform linux/amd64,linux/arm64 -t docker-spfx-00 . 57 | ``` 58 | 59 | ### Testing a new project 60 | 61 | ```sh 62 | docker run --rm -it -p 4321:4321 -p 35729:35729 docker-spfx-00 63 | ``` 64 | 65 | Run in the new container: 66 | 67 | ```sh 68 | cd /home/spfx 69 | yo @microsoft/sharepoint --solution-name helloworld --component-type webpart --component-name hello-world-webpart --component-description "HelloWorld web part" --is-domain-isolated false --framework none --environment spo --skip-feature-deployment false --no-insight 70 | cd helloworld/ 71 | cat < Shared Drives** verify that the drive where you create your projects is shared 12 | - Create a folder for your SharePoint Framework project 13 | - In the command line (on macOS): 14 | 15 | ```sh 16 | cd [your project] 17 | docker run -it --rm --name ${PWD##*/} -v $PWD:/usr/app/spfx -p 4321:4321 -p 35729:35729 m365pnp/spfx 18 | ``` 19 | 20 | - In PowerShell on Windows: 21 | 22 | ```PowerShell 23 | cd [your project] 24 | docker run -it --rm --name spfx-helloworld -v ${PWD}:/usr/app/spfx -p 4321:4321 -p 35729:35729 m365pnp/spfx 25 | ``` 26 | 27 | - In other shells on Windows 28 | 29 | ```cmd 30 | cd [your project] 31 | docker run -it --rm --name spfx-helloworld -v %cd%:/usr/app/spfx -p 4321:4321 -p 35729:35729 m365pnp/spfx 32 | ``` 33 | 34 | After the container started you can work with it the same way you would work with SharePoint Framework installed on your host. To create a new SharePoint Framework project in the container command line execute: 35 | 36 | ```sh 37 | yo @microsoft/sharepoint 38 | ``` 39 | 40 | All files scaffolded by the generator will be stored in your project directory on your host from where you can commit them to source control. 41 | 42 | To close the container in the container command line run: 43 | 44 | ```sh 45 | exit 46 | ``` 47 | 48 | You can also use this image for [Visual Studio development containers](./DevelopmentContainers.md) 49 | 50 | ## Available tags 51 | 52 | - **latest**: contains the SharePoint Framework Yeoman generator from the [1.21.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.21.1?WT.mc_id=m365-0000-wmastyka) release 53 | - **online**: contains the SharePoint Framework Yeoman generator from the [1.21.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.21.1?WT.mc_id=m365-0000-wmastyka) release 54 | - **onprem**: contains the SharePoint Framework Yeoman generator from the [1.4.1](https://github.com/sharepoint/sp-dev-docs/wiki/Release-Notes-for-SPFx-Package-Version-1.4.1) release 55 | - **1.21.1**: contains the SharePoint Framework Yeoman generator from the [1.21.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.21.1?WT.mc_id=m365-0000-wmastyka) release 56 | - **1.21.0**: contains the SharePoint Framework Yeoman generator from the [1.21.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.21?WT.mc_id=m365-0000-wmastyka) release 57 | - **1.20.0**: contains the SharePoint Framework Yeoman generator from the [1.20.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.20?WT.mc_id=m365-0000-wmastyka) release 58 | - **1.19.0**: contains the SharePoint Framework Yeoman generator from the [1.19.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.19?WT.mc_id=m365-0000-wmastyka) release 59 | - **1.18.2**: contains the SharePoint Framework Yeoman generator from the [1.18.2](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.18.2?WT.mc_id=m365-0000-wmastyka) release 60 | - **1.18.1**: contains the SharePoint Framework Yeoman generator from the [1.18.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.18.1?WT.mc_id=m365-0000-wmastyka) release 61 | - **1.18.0**: contains the SharePoint Framework Yeoman generator from the [1.18.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.18?WT.mc_id=m365-0000-wmastyka) release 62 | - **1.17.4**: contains the SharePoint Framework Yeoman generator from the [1.17.4](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.17.4?WT.mc_id=m365-0000-wmastyka) release 63 | - **1.17.3**: contains the SharePoint Framework Yeoman generator from the [1.17.3](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.17.3?WT.mc_id=m365-0000-wmastyka) release 64 | - **1.17.2**: contains the SharePoint Framework Yeoman generator from the [1.17.2](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.17.2?WT.mc_id=m365-0000-wmastyka) release 65 | - **1.17.1**: contains the SharePoint Framework Yeoman generator from the [1.17.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.17.1?WT.mc_id=m365-0000-wmastyka) release 66 | - **1.17.0**: contains the SharePoint Framework Yeoman generator from the [1.17.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.17?WT.mc_id=m365-0000-wmastyka) release 67 | - **1.16.1**: contains the SharePoint Framework Yeoman generator from the [1.16.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.16.1?WT.mc_id=m365-0000-wmastyka) release 68 | - **1.16.0**: contains the SharePoint Framework Yeoman generator from the [1.16.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.16?WT.mc_id=m365-0000-wmastyka) release 69 | - **1.15.2**: contains the SharePoint Framework Yeoman generator from the [1.15.2](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.15.2?WT.mc_id=m365-0000-wmastyka) release 70 | - **1.15.0**: contains the SharePoint Framework Yeoman generator from the [1.15.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.15?WT.mc_id=m365-0000-wmastyka) release 71 | - **1.14.0**: contains the SharePoint Framework Yeoman generator from the [1.14.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.14?WT.mc_id=m365-0000-wmastyka) release 72 | - **1.13.1**: contains the SharePoint Framework Yeoman generator from the [1.13.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.13.1?WT.mc_id=m365-0000-wmastyka) release 73 | - **1.13.0**: contains the SharePoint Framework Yeoman generator from the [1.13.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.13?WT.mc_id=m365-0000-wmastyka) release 74 | - **1.12.1**: contains the SharePoint Framework Yeoman generator from the [1.12.1](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.12.1?WT.mc_id=m365-0000-wmastyka) release 75 | - **1.12.0**: contains the SharePoint Framework Yeoman generator from the 1.12.0 release 76 | - **1.11.0**: contains the SharePoint Framework Yeoman generator from the [1.11.0](https://docs.microsoft.com/sharepoint/dev/spfx/release-1.11.0?WT.mc_id=m365-0000-wmastyka) release 77 | - **1.10.0**: contains the SharePoint Framework Yeoman generator from the [1.10.0](https://github.com/sharepoint/sp-dev-docs/wiki/SharePoint-Framework-v1.10-release-notes) release 78 | - **1.9.1**: contains the SharePoint Framework Yeoman generator from the [1.9.1](https://github.com/sharepoint/sp-dev-docs/wiki/SharePoint-Framework-v1.9.1-release-notes) release 79 | - **1.8.2**: contains the SharePoint Framework Yeoman generator from the [1.8.2](https://github.com/sharepoint/sp-dev-docs/wiki/SharePoint-Framework-v1.8.2-release-notes) release 80 | - **1.8.1**: contains the SharePoint Framework Yeoman generator from the [1.8.1](https://github.com/sharepoint/sp-dev-docs/wiki/SharePoint-Framework-v1.8.1-release-notes) release 81 | - **1.8.0**: contains the SharePoint Framework Yeoman generator from the [1.8.0](https://github.com/sharepoint/sp-dev-docs/wiki/SharePoint-Framework-v1.8-release-notes) release 82 | - **1.7.1**: contains the SharePoint Framework Yeoman generator from the [1.7.1](https://github.com/sharepoint/sp-dev-docs/wiki/Release-Notes-for-SPFx-Package-Version-1.7.1) release 83 | - **1.7.0**: contains the SharePoint Framework Yeoman generator from the [1.7.0](https://github.com/SharePoint/sp-dev-docs/wiki/SharePoint-Framework-v1.7-release-notes) release 84 | - **1.6.0**: contains the SharePoint Framework Yeoman generator from the [1.6.0](https://github.com/sharepoint/sp-dev-docs/wiki/v-1.6-release-notes) release 85 | - **1.5.1**: contains the SharePoint Framework Yeoman generator from the [1.5.1](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-for-SPFx-Package-Version-1.5.1) release 86 | - **1.5.0**: contains the SharePoint Framework Yeoman generator from the [1.5.0](https://github.com/sharepoint/sp-dev-docs/wiki/Release-Notes-for-SharePoint-Framework-Package-v1.5) release 87 | - **1.4.1**: contains the SharePoint Framework Yeoman generator from the [1.4.1](https://github.com/sharepoint/sp-dev-docs/wiki/Release-Notes-for-SPFx-Package-Version-1.4.1) release 88 | - **1.4.0**: contains the SharePoint Framework Yeoman generator from the [1.4.0](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-for-SPFx-Package-Version-1.4) release 89 | - **1.3.4**: contains the SharePoint Framework Yeoman generator from the [1.3.4](https://dev.office.com/blogs/improved-support-for-office-ui-fabric-core) release 90 | - **1.3.2**: contains the SharePoint Framework Yeoman generator from the 1.3.2 release 91 | - **1.3.1**: contains the SharePoint Framework Yeoman generator from the 1.3.1 release 92 | - **1.3.0**: contains the SharePoint Framework Yeoman generator from the 1.3.0 release 93 | - **1.2.0**: contains the SharePoint Framework Yeoman generator from the [1.2.0](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes---Extensions-RC-Drop-1.2) release 94 | - **1.1.3**: contains the SharePoint Framework Yeoman generator from the 1.1.3 release 95 | - **1.1.1**: contains the SharePoint Framework Yeoman generator from the [1.1.1](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes---Extensions-Dev-Preview-Drop-1) release 96 | - **1.1.0**: contains the SharePoint Framework Yeoman generator from the [1.1.0](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes---Extensions-Dev-Preview-Drop-1) release 97 | - **1.0.2**: contains the SharePoint Framework Yeoman generator from the 1.0.2 release 98 | - **ga**: contains the SharePoint Framework Yeoman generator from the [GA](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-GA) release 99 | - **rc0**: contains the SharePoint Framework Yeoman generator from the [RC0](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-RC0) release 100 | - **drop-6**: contains the SharePoint Framework Yeoman generator from the [developer preview drop 6](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-Drop-6) 101 | - **drop-5**: contains the SharePoint Framework Yeoman generator from the [developer preview drop 5](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-Drop-5) 102 | - **drop-4**: contains the SharePoint Framework Yeoman generator from the [developer preview drop 4](https://github.com/SharePoint/sp-dev-docs/wiki/Release-Notes-Drop-4-and-MDL2) 103 | 104 | ## Known issues 105 | 106 | ### Unable to write files to disk 107 | 108 | When running `yo @microsoft/sharepoint` you get an error that the container is unable to write files to the disk. In most cases this is caused by the drive not being shared in Docker. Go to Docker > Settings > Sharing to enable sharing the drive where your project is located. 109 | 110 | ### Can't access workbench and bundles in SharePoint Framework >=1.14.0 111 | 112 | When using the container with SharePoint Framework >=v1.14.0, you can't access the local workbench or can't load bundles in the hosted workbench. This is caused by the default mapping of the workbench to localhost, which isn't accessible outside of the container. To fix it, map the workbench to `0.0.0.0`, by modifying the `./config/serve.json` file in your SharePoint Framework project to: 113 | 114 | ```json 115 | { 116 | "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json", 117 | "port": 4321, 118 | "ipAddress": "0.0.0.0", 119 | "https": true, 120 | "initialPage": "https://enter-your-SharePoint-site/_layouts/workbench.aspx" 121 | } 122 | ``` 123 | 124 | ### Can't access workbench and bundles in SharePoint Framework >=1.6.0 <=1.13.1 125 | 126 | When using the container with SharePoint Framework >=v1.6.0, you can't access the local workbench or can't load bundles in the hosted workbench. This is caused by the default mapping of the workbench to localhost, which isn't accessible outside of the container. To fix it, map the workbench to `0.0.0.0`, by modifying the `./config/serve.json` file in your SharePoint Framework project to: 127 | 128 | ```json 129 | { 130 | "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json", 131 | "port": 4321, 132 | "hostname": "0.0.0.0", 133 | "https": true, 134 | "initialPage": "https://enter-your-SharePoint-site/_layouts/workbench.aspx" 135 | } 136 | ``` 137 | 138 | ### Can't access bundles in SharePoint Framework 1.13.1 139 | 140 | Modify `node_modules\@microsoft\spfx-heft-plugins\lib\plugins\webpackConfigurationPlugin\WebpackConfigurationGenerator.js:393` 141 | 142 | ```javascript 143 | const debugBaseUrl = `${serveConfig.https ? 'https' : 'http'}://${serveConfig.hostname || 'localhost'}:${serveConfig.port || 4321}/${distFolderName}/`; 144 | ``` 145 | 146 | to: 147 | 148 | ```javascript 149 | const debugBaseUrl = `${serveConfig.https ? 'https' : 'http'}://localhost:${serveConfig.port || 4321}/${distFolderName}/`; 150 | ``` 151 | 152 | ### Can't access bundles in SharePoint Framework 1.12.1 153 | 154 | Modify `node_modules\@microsoft\spfx-heft-plugins\lib\plugins\webpackConfigurationPlugin\WebpackConfigurationGenerator.js:376` 155 | 156 | ```javascript 157 | const debugBaseUrl = `${serveConfig.https ? 'https' : 'http'}://${serveConfig.hostname || 'localhost'}:${serveConfig.port || 4321}/dist/`; 158 | ``` 159 | 160 | to: 161 | 162 | ```javascript 163 | const debugBaseUrl = `${serveConfig.https ? 'https' : 'http'}://localhost:${serveConfig.port || 4321}/dist/`; 164 | ``` 165 | 166 | ### Can't access workbench and bundles in SharePoint Framework >=1.6.0 <=1.11.0 on Windows 167 | 168 | When using the container with SharePoint Framework >=v1.6.0 on Windows, you can't access the local workbench despite following the steps from the previous section. This has to do with Windows being unable to correctly access 0.0.0.0. To fix it, first, modify `config\write-manifests.json` to (add the `debugBasePath` property): 169 | 170 | ```json 171 | { 172 | "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/write-manifests.schema.json", 173 | "cdnBasePath": "", 174 | "debugBasePath": "https://localhost:4321/" 175 | } 176 | ``` 177 | 178 | Then, open `node_modules\@microsoft\sp-build-web\lib\SPWebBuildRig.js` and change lines from: 179 | 180 | ```js 181 | spBuildCoreTasks.writeManifests.mergeConfig({ 182 | debugBasePath: `${serve.taskConfig.https ? 'https' : 'http'}://${serve.taskConfig.hostname}:${serve.taskConfig.port}/` 183 | }); 184 | ``` 185 | 186 | to (add the `if` statement): 187 | 188 | ```js 189 | if (!spBuildCoreTasks.writeManifests.taskConfig.debugBasePath) { 190 | spBuildCoreTasks.writeManifests.mergeConfig({ 191 | debugBasePath: `${serve.taskConfig.https ? 'https' : 'http'}://${serve.taskConfig.hostname}:${serve.taskConfig.port}/` 192 | }); 193 | } 194 | ``` 195 | 196 | Depending on the SPFx version the lines to replace are different: 197 | 198 | | SPFx version | SPWebBuildRig.js lines to replace | 199 | | ------------- | ------------- | 200 | | 1.6.0, 1.7.0 or 1.7.1 | 83-85 | 201 | | 1.8.0, 1.8.1 or 1.8.2 | 88-90 | 202 | | 1.9.1 | 92-94 | 203 | | 1.10.0 or 1.11.0 | 96-98 | 204 | 205 | ### Can't access workbench and bundles in SharePoint Framework 1.5.0 206 | 207 | When using the container with SharePoint Framework v1.5.0, you can't access the local workbench or can't load bundles in the hosted workbench. This is caused by a change to the `gulp-connect` package used by the `gulp serve` task. To fix the issue, after scaffolding the project, in the code editor open the `./node_modules/gulp-connect/index.js` file and change line 106 from: 208 | 209 | ```js 210 | return this.server.listen(this.port, this.host, (function(_this) { 211 | ``` 212 | 213 | to (remove the `this.host` argument): 214 | 215 | ```js 216 | return this.server.listen(this.port, (function(_this) { 217 | ``` 218 | 219 | ## Limitations 220 | 221 | Windows 10 Anniversary Update and Windows Server 2016 have native support for containers. At this moment Windows supports only containers built on Windows Server Core or Nano Server and you won't be able to run this container natively on Windows. Instead you should use Docker for Windows or Docker Toolbox. 222 | -------------------------------------------------------------------------------- /assets/VScorner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/VScorner.png -------------------------------------------------------------------------------- /assets/github-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/github-code.png -------------------------------------------------------------------------------- /assets/github-create-space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/github-create-space.png -------------------------------------------------------------------------------- /assets/github-open-vs-confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/github-open-vs-confirm.png -------------------------------------------------------------------------------- /assets/github-open-vs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/github-open-vs.png -------------------------------------------------------------------------------- /assets/vs-containers-selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/vs-containers-selector.png -------------------------------------------------------------------------------- /assets/vs-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/vs-files.png -------------------------------------------------------------------------------- /assets/vs-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/vs-log.png -------------------------------------------------------------------------------- /assets/vs-ports.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pnp/docker-spfx/342a4ae9c9a4115152d2229242c89dd4e1f6014b/assets/vs-ports.png --------------------------------------------------------------------------------