Change in .clasp.json location & behavior with --rootDir
Steps to reproduce the problem
- Install clasp locally
- Create a project using --rootDir
- Attempt to push files
Expected Behavior
(as in 2.4.0:) 4. Success
% mkdir -p project-2.4.0/{src,tools}
% cd project-2.4.0/tools
% npm install @google/[email protected]
...
% ./node_modules/.bin/clasp create --type webapp --title test-2.4.0 --rootDir ../src
Created new webapp script: https://script.google.com/d/.../edit
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 1 file.
└─ ../src/appsscript.json
% ./node_modules/.bin/clasp push
└─ ../src/appsscript.json
Pushed 1 file.
Actual Behavior
(in 2.4.1:) 4. .clasp.json file (now in rootDir rather than same directory) not found; must run with clasp -P rootdir
% mkdir -p project-2.4.1/{tools,src}
% cd project-2.4.1/tools
% npm install @google/[email protected]
...
% ./node_modules/.bin/clasp create --type webapp --title test-2.4.1 --rootDir ../src
Created new webapp script: https://script.google.com/d/.../edit
Warning: files in subfolder are not accounted for unless you set a '../src/.claspignore' file.
Cloned 1 file.
└─ ../src/appsscript.json
% ./node_modules/.bin/clasp push
No valid /Users/chjones/Downloads/project-2.4.1/tools/.clasp.json project file. You may need to `create` or `clone` a project first.
% ./node_modules/.bin/clasp -P ../src push
└─ ../src/appsscript.json
Pushed 1 file.
Specifications
- Node version (
node -v): 16.5.0 - Version (
clasp -v): 2.4.1 - OS (Mac/Linux/Windows):Mac
Presumably this is associated with #865 ; the new behavior may be the "correct" one, but failure to create .clasp.json in the working directory is a breaking change when that is expected (at least, for some of my scripts. :-) ) Is this worth specifying in documentation or release notes?
Thanks as always, CDJ
Additional issue: as the relative directory rootDir is also written to .clasp.json as given to the --rootDir option., clasp -P must also be called from a directory at a certain hierarchy.
From the above, if we are in the tools directory and use clasp create ... --rootDir ../src to place the project in the given src directory, ../src is written to .clasp.json, hence moving up a directory level and calling clasp -P src/ ... results in:
% clasp -P src/ push
ENOENT: no such file or directory, open '../src/appsscript.json'
If we can agree on desired behavior for --rootDir and -P I'm happy to work on a PR. Thanks again!
also noticed this behavior breaking my app (built on https://github.com/enuchi/React-Google-Apps-Script) when npm decided to bump from clasp version 2.4.0 to 2.4.1! Might confuse others, especially if the breaking change comes from a minor version bump!
I figured out that:
clasp pushneed a.clasp.jsonto know what to do.clasp create ... --rootDir ./distcreate.clasp.jsonautomatically and store it at./dist/.clasp.json- BUT IF
./distDIRECTORY DOES NOT EXIST CLASP WON'T CREATE THE FILE.
- BUT IF
IF YOU ARE CREATING A NEW PROJECT
( Google Sheets as Container in this example )
It's better you initialize the project with :
cd ~/Desktop
mkdir my-gas-project
cd my-gas-project
clasp create --type sheets --title "MySheetsContainer" --rootDir .
This let clasp create the .clasp.json in the current working directory.
Then, assumed your code bundler (ie. webpack ) put your code inside ./dist, you need to manually update the .clasp.json :
{
"scriptId": "1AFqeTOrlAA7TjcbAuW9Pqt_cxPVliUfeagV1YDS9WNHJK62RD8G2Lwt0",
"rootDir": "./dist", // <- HERE PUT YOUR BUNDLE DIRECTORY
"parentId": ["1lViSwkMtrnJcYSvi9NcvmO2OamJzgXz_dUoXNn0SxVQ"]
}
IF YOU'VE ALREADY CREATED A PROJECT
In this case you should not have the .clasp.json file.
So create .clasp.json and put in project root directory , or the directory from where you call clasp pull | push:
{
"scriptId":"1AFqeTOrlAB7TrcbAuW9Pqt_cxPVliUfeagV1YDS9WNHJK62RD8G2Lwt0",
"rootDir":"./dist", // <- HERE PUT YOUR BUNDLE DIRECTORY
"parentId":["1lViSwuMtrnJcYHvi9NcvmO2OamJzgXz_dUoXNn0SxVQ"]
}
I did the following:
- Install clasp locally
- Clone a project from /myproject using --rootDir src
- Attempt to push files
Actual Result:
"No valid [full path] /myproject/clasp.json project file. You may need to create or clone a project first."
The .clasp.json project file was created in the /myproject/src.
Move the .clasp.json file I moved the .clasp.json file from /myproject/src to /myproject.
Running clasp push from /myproject now works as expected.
I did the following:
- Install clasp locally
- Clone a project from /myproject using --rootDir src
- Attempt to push files
Actual Result: "No valid [full path] /myproject/clasp.json project file. You may need to
createorclonea project first."The .clasp.json project file was created in the /myproject/src.
Move the .clasp.json file I moved the .clasp.json file from /myproject/src to /myproject.
Running clasp push from /myproject now works as expected.
That worked for me too. Thanks a lot!
I doubt this is the correct behavior, at least it's very counter-intuitive (#923).
I think "specified directory" in #832 was misunderstood to mean "specified by --rootDir", but rootDir is documented as:
Local directory in which clasp will store your project files.
I'd interpret "project files" as "pushed files", as in telling clasp which subdirectory should be pushed, analogous to TypeScript's include.
As far as I can tell this is what it was intended for (#22 / #25), how it's commonly used and how it functions. The example in the README seems to support this, listing a build folder for rootDir. The README also says:
When running
cloneorcreate, a file named.clasp.jsonis created in the current directory to describe clasp's configuration for the current project.
This is no longer true, .clasp.json is now created in the provided rootDir.
The suggested workaround with -P seems unnecessarily tedious and undermining the purpose of rootDir, not to mention hazardous with shenanigans around relative paths as mentioned by @therealchjones.
Proposal
I propose the following changes to create, clone and rootDir:
- A relative
rootDirin.clasp.jsonis always resolved against the location of.clasp.jsonto avoid shenanigans. A relative--rootDirpassed tocreateandcloneshould still be resolved against the current working directory. - The
createandclonecommands always put the new.clasp.jsonin the current working directory, containing a relative path to the passedrootDirif applicable. The created/cloned files are put inside--rootDir. - Rename
rootDirto something likesourceDir,buildDir,distDir,synchronizedDirorgapDirto clarify its function and make its purpose more explicit.rootDircould stay as an alias with a deprecation warning for now to avoid a breaking change.
I'd love to hear your thoughts on this! I'll look into creating a draft PR to see how this plays out.