The key goal was to speed up the PCF developer's inner loop, to help you move more quickly through your fix-build-test cycle. Prior to this feature, getting your PCF control into your org involved building your full solution and manually importing it. (The ‘npm start watch’ feature was also added due to this focus on speeding up the inner loop.)
What about the version in the Control Manifest?
When a solution with PCF is imported, the system looks at the version specified in the control manifest and only imports the control if the version in the incoming control is higher than the control that exists in the org. This mechanic is designed to be used as a part of your overall solution ALM, but it felt like it was getting in the way of the developer inner loop. We didn't want you to have to keep bumping the version in your manifest as you coded your control.
When you use 'pcf push,' the version check is skipped, and the control built from your source code is imported over the top of what is in the org.
Will ‘pcf push’ always succeed?
There are cases when ‘pcf push’ will fail. The case that most folks may hit is if you make a change to the manifest that adds or removes properties that are required or bound. One workaround for this is to first remove the control using the Web UI and then run ‘pcf push’ again.
Can ‘pcf push’ be used to deploy to production?
The 'pcf push' command will only build and deploy an unmanaged version of your control. It is not designed to be used for production, where managed solutions are recommended.
What is this new solution I see called PowerAppsTools_XXX?
The ‘pcf push’ command creates a temporary solution for the purposes of importing the project’s control. This temporary solution is written to the $\[projectdir]\obj directory and is always named “PowerAppsTools_[publisher-prefix]”. You can delete it once you are done using ‘pcf push’ for that PCF project. Deleting this temporary solution will not delete the control it contains.
Why do I need to specify the publisher prefix when using ‘pcf push’?
A change was recently made to how PCF controls are named, and their full name in the solution now includes the publisher prefix like many other components in CDS. In order to avoid name collisions, you need to specify the same publisher prefix that will be used in the solution that will deploy the control.
Does ‘pcf push’ replace the need for a cdsproj?
No, they are designed to be used in different parts of the development lifecycle.
The ‘pcf push’ command only imports one control at a time and only as unmanaged.
The cdsproj (or solution project) is there to help you build all the components in your solution, both managed and unmanaged. It performs a similar function to what SolutionPackager /pack does, but is integrated with build and is aware of the need to pull in the currently built bits of your control before packing (assuming you have added a reference with ‘solution add-reference’).
How should I use these features together?
Here is one possible way that development could proceed.
Use ‘pcf init’ to create your control
‘npm start’ and test with local harness and/or ‘pcf push’ and test in live Org
When control is ready to be added to your solution…
If you don’t have a solution, use ‘solution init’ to create your solution project
For your new or existing solution, use ‘solution add-reference’ to add the pcf project to your solution
Build your solution managed or unmanaged
Import and test your managed or unmanaged solution
What if I have multiple PCF projects?
You can use the ‘pcf push’ command against multiple PCF projects. If these controls use the same publisher prefix, then they will end up under the same temporary solution. Any controls that use a different publisher prefix will end up under a different temporary solution.
For example, you might see these solutions and controls after running 'pcf push' against a few projects:
It would be great if we could have the ability to push a new version of a control to update the manifest using pac push. Currently, we get an error if the version number of the control is different than deployed.