Turns out I needed the JAVA_TOOL_OPTIONS environment variable set to
-Dfile.encoding=UTF8 to get the release build working. Closure compiler
doesn't seem to like files that are not UTF-8.

It seemed strange to me that an environment variable was necessary to work
around the issue, so I fixed the problem: The compiler will now always
generate JS as UTF-8.

--
Josh Tynjala
Bowler Hat LLC <https://bowlerhat.dev>


On Tue, Jul 16, 2019 at 1:01 PM Josh Tynjala <[email protected]>
wrote:

> I made some tweaks to the royale-maven-plugin to make it properly use
> external-library-path (and js-external-library-path). Now, I can
> successfully create a debug build of TourDeJewel with Maven.
>
> However, it looks like App.js in the release build is empty except for the
> source mapping URL. I'm not sure what's going on there. Maybe I'm running
> the wrong command to have it also produce a release build.
>
> --
> Josh Tynjala
> Bowler Hat LLC <https://bowlerhat.dev>
>
>
> On Tue, Jul 16, 2019 at 9:47 AM Josh Tynjala <[email protected]>
> wrote:
>
>> Thanks. I'm investigating.
>>
>> I've figured out that the Maven build is still using library-path (or
>> js-library-path) instead of external-library-path (or
>> js-external-library-path) when building the framework SWCs.
>>
>> If I run "mvn clean install" in frameworks/projects/Jewel, I can see that
>> a target/compile-js-config.xml file is created, and it's using
>> js-library-path for framework SWCs. I'm still figuring out where this
>> config file is coming from and how to change it.
>>
>> --
>> Josh Tynjala
>> Bowler Hat LLC <https://bowlerhat.dev>
>>
>>
>> On Tue, Jul 16, 2019 at 9:00 AM Piotr Zarzycki <[email protected]>
>> wrote:
>>
>>> Josh,
>>>
>>> It looks like something is happened actually. Latest build on server
>>> failed, but was able to build all examples and TourDeJewel is not running
>>> [1]
>>>
>>> [1]
>>>
>>> https://builds.apache.org/job/Royale-asjs/1956/artifact/examples/royale/TourDeJewel/target/javascript/bin/js-debug/index.html
>>>
>>> Thanks,
>>> Piotr
>>>
>>> wt., 16 lip 2019 o 17:58 Harbs <[email protected]> napisaƂ(a):
>>>
>>> > These warnings look new:
>>> >
>>> > Jul 16, 2019 6:55:16 PM com.google.javascript.jscomp.LoggerErrorManager
>>> > println
>>> > WARNING: externs/dialogPolyfill.js:15: WARNING - accessing name
>>> > dialogPolyfill in externs has no effect. Perhaps you forgot to add a
>>> var
>>> > keyword?
>>> > dialogPolyfill = function() {
>>> > ^^^^^^^^^^^^^^
>>> >
>>> > Jul 16, 2019 6:55:16 PM com.google.javascript.jscomp.LoggerErrorManager
>>> > println
>>> > WARNING: externs/dialogPolyfill.js:15: WARNING - variable
>>> dialogPolyfill
>>> > is undeclared
>>> > dialogPolyfill = function() {
>>> > ^^^^^^^^^^^^^^
>>> >
>>> > Jul 16, 2019 6:55:16 PM com.google.javascript.jscomp.LoggerErrorManager
>>> > println
>>> > WARNING: externs/dialogPolyfill.js:23: WARNING - name dialogPolyfill is
>>> > not defined in the externs.
>>> > dialogPolyfill.registerDialog = function(dialog) {
>>> > ^^^^^^^^^^^^^^
>>> >
>>> > Jul 16, 2019 6:55:16 PM com.google.javascript.jscomp.LoggerErrorManager
>>> > println
>>> > WARNING: externs/hljs.js:19: WARNING - accessing name hljs in externs
>>> has
>>> > no effect. Perhaps you forgot to add a var keyword?
>>> > hljs = function() {
>>> > ^^^^
>>> >
>>> > Jul 16, 2019 6:55:16 PM com.google.javascript.jscomp.LoggerErrorManager
>>> > println
>>> > WARNING: externs/hljs.js:19: WARNING - variable hljs is undeclared
>>> > hljs = function() {
>>> > ^^^^
>>> >
>>> > Jul 16, 2019 6:55:16 PM com.google.javascript.jscomp.LoggerErrorManager
>>> > println
>>> > WARNING: externs/hljs.js:27: WARNING - name hljs is not defined in the
>>> > externs.
>>> > hljs.highlightBlock = function(block) {
>>> > ^^^^
>>> >
>>> > Any thoughts on this?
>>> >
>>> > > On Jul 15, 2019, at 10:32 PM, Josh Tynjala <
>>> [email protected]>
>>> > wrote:
>>> > >
>>> > > Hey folks,
>>> > >
>>> > > I just pushed some commits to royale-compiler and royale-asjs, and I
>>> > wanted
>>> > > to add a little explanation, and some possible troubleshooting
>>> advice if
>>> > > anything seems to have broken in your apps.
>>> > >
>>> > > My work over the last week has been to fix an issue related to
>>> specifying
>>> > > dependencies when compiling libraries for JS. As you probably know,
>>> the
>>> > > compiler supports two options for adding libraries as dependencies,
>>> > > library-path and external-library-path. The library-path compiler
>>> option
>>> > > basically says "include all classes that I use from this SWC in the
>>> final
>>> > > output". It's typically what you use when compiling an app that uses
>>> a
>>> > > library. The external-library-path compiler option basically says
>>> "if I
>>> > use
>>> > > anything from this SWC, check that I'm using the types correctly, but
>>> > don't
>>> > > include any of classes from this SWC in the final output".
>>> > >
>>> > > If you're compiling an app, you typically use library-path for
>>> > everything.
>>> > > You use external-library-path only for dependencies like
>>> > > playerglobal.swc/airglobal.swc in Flash or typedef SWCs in JS.
>>> Basically,
>>> > > for an app project, external-library-path is for classes that are
>>> > provided
>>> > > natively by the Flash runtime or a web browser, like Chrome or
>>> Firefox.
>>> > >
>>> > > When compiling libraries, external-library-path is also used to
>>> prevent
>>> > the
>>> > > compiler from creating a "fat" library that stuffs in all of the
>>> > > dependencies. Let's say that you have a library, A.swc. It provides
>>> some
>>> > > core functionality that is needed by both B.swc and C.swc. When we
>>> > compile
>>> > > B.swc and C.swc, we don't want the classes from A.swc duplicated in
>>> both
>>> > of
>>> > > them. So we add A.swc to the external-library-path when compiling
>>> B.swc
>>> > or
>>> > > C.swc. Then, if you use those SWCs when compiling an app, you need
>>> to add
>>> > > A.swc, B.swc, and C.swc to the library-path.
>>> > >
>>> > > To put that in Royale terms, A.swc is something like LanguageJS.swc
>>> or
>>> > > CoreJS.swc. They're some of our lowest-level SWCs in the framework.
>>> B.swc
>>> > > and C.swc are more like BasicJS.swc or JewelJS.swc, and they tend to
>>> > share
>>> > > multiple classes from the lower-level stuff.
>>> > >
>>> > > Up until now, library-path and external-library-path were a little
>>> quirky
>>> > > when compiling to JS. It was related to the goog.provide() and
>>> > > goog.require() calls that you might have seen in the generated JS.
>>> These
>>> > > are from the module system that we use in Royale. The compiler didn't
>>> > know
>>> > > how to differentiate between classes that had goog.provide() and
>>> classes
>>> > > that were typedefs for JS libraries. It treated everything on the
>>> > > external-library-path as a typedef, and this led to missing
>>> > goog.require()
>>> > > calls in the generated JS. To work around this, when we specified
>>> > > dependencies in our framework SWCs, we used library-path to ensure
>>> that
>>> > > goog.require() would be used.
>>> > >
>>> > > This workaround of using library-path led to "fat" SWCs that
>>> contained
>>> > all
>>> > > of their dependencies. Low-level classes in SWCs like CoreJS were
>>> > > duplicated in higher-level SWCs. This led to the compiler getting
>>> > confused
>>> > > about exactly where a class was defined.
>>> > >
>>> > > This has resulted in some minor issues here and there, but nothing
>>> too
>>> > > major until recently. However, Harbs noticed the other day that it
>>> caused
>>> > > the compiler to copy extra default CSS into apps from SWCs that you
>>> may
>>> > not
>>> > > have been using. So, you might build an app with the Basic
>>> components,
>>> > but
>>> > > you'd get extra CSS from Jewel or MaterialDesignLite. This could
>>> mess up
>>> > > your app's styling pretty dramatically.
>>> > >
>>> > > I updated the compiler to better detect when a class needs
>>> goog.require()
>>> > > and when it's a typedef. If that class comes from a SWC, the compiler
>>> > knows
>>> > > to check for an included file like, js/out/com/example/MyClass.js.
>>> If the
>>> > > generated JS is there, goog.require() is necessary. If it's missing,
>>> it's
>>> > > treated as a typedef class instead. If the class is an .as source
>>> file
>>> > > instead, the compiler looks for the @externs asdoc tag to determine
>>> if
>>> > it's
>>> > > a typedef class (and everything else needs goog.require() instead).
>>> > >
>>> > > By the way, if we ever support other module systems, it shouldn't be
>>> too
>>> > > difficult to extend this code to detect different SWC layouts for
>>> each
>>> > > module system.
>>> > >
>>> > > If your project is an app, this change should not cause any problems.
>>> > > You're probably using library-path and external-library-path
>>> correctly.
>>> > >
>>> > > If you have a project that is a library, you should check your
>>> compiler
>>> > > options to see if you are using library-path and
>>> external-library-path
>>> > > correctly. If your library depends on another library, you probably
>>> > should
>>> > > be using external-library-path because you don't want a "fat" SWC. In
>>> > other
>>> > > words, if you're using library-path in a library project, you
>>> probably
>>> > need
>>> > > to change that to external-library-path.
>>> > >
>>> > > If you have any custom typedef SWCs, you may want to recompile them.
>>> At
>>> > one
>>> > > point, the compiler had a bug where classes in typedef SWCs were
>>> being
>>> > > incorrectly added to the "js/out" folder in the SWC, but that was
>>> > > incorrect. They should have been placed in an "externs" folder
>>> instead.
>>> > The
>>> > > compiler handles this correctly now, but old typedef SWCs may look
>>> like
>>> > > goog.require() SWCs instead. To be sure, you can open a SWC file in
>>> any
>>> > > program that can read ZIP files, and you'll see the internal folder
>>> > > structure. If a typedef SWC has a "js/out" folder, it's not going to
>>> work
>>> > > properly.
>>> > >
>>> > > If you're working directly out of the royale-compiler and
>>> royale-asjs Git
>>> > > repos, be sure to update and rebuild them both. The nightly builds
>>> should
>>> > > be updated shortly.
>>> > >
>>> > > When you build any apps, be sure to clean first, just to be sure
>>> that you
>>> > > have the latest JS files from the SWCs.
>>> > >
>>> > > If you run into any other problems with these changes, please let me
>>> > know.
>>> > > I'll get them fixed right away!
>>> > >
>>> > > --
>>> > > Josh Tynjala
>>> > > Bowler Hat LLC <https://bowlerhat.dev>
>>> >
>>> >
>>>
>>> --
>>>
>>> Piotr Zarzycki
>>>
>>> Patreon: *https://www.patreon.com/piotrzarzycki
>>> <https://www.patreon.com/piotrzarzycki>*
>>>
>>

Reply via email to