SlideShare ist ein Scribd-Unternehmen logo
1 von 62
Downloaden Sie, um offline zu lesen
Rowan: A new project/package
manager
Jadeite: A Development client
for Rowan and GemStone/S
Dale Henrichs
GemTalk Systems
ESUG 2018
Jadeite
Current Rowan Status
● In production at a GemTalk customer site
● Running on Gemstone/S 3.2.15
● Still not quite feature complete
Current Jadeite Status
● Customer is currently using an early Alpha Jadeite
for development
● Plan to release to customer a new JadeiteAlpha
● Jadeite runs on Windows, but can be used on a Mac
with Wine installed.
Rowan
Rowan is an updated implementation of Monticello and
awholesale replacement for Metacello.
Rowan Structure
Project
– Configurations
● Configurations
● External Project References
● Packages
– Classes
● Methods
– Class Extensions
● Methods
Fine print: External project references not yet implemented
Rowan project
(in image)
● Named
● Associated with a set of directories on disk
● SCM neutral, but Git aware
● Loaded using a `project load specification`
Rowan project load
speci!cation
(1 of 3)
● Named
● Specifies disk structure:
– src directory for packages
– configs directory for configurations
– specs directory for load specs
● Specifies load parameters
– List of configuration names and group names
– Remote repository specifics
Rowan project load
speci!cation
(2 of 3)
● Instance-based (declarative)
– Stored as STON on disk
– Potential for multiple implementations
● depending upon needs of project
● Support future expansion
● Located anywhere
– Meant to be copied and customized
– Typically reference via an url (`file:` or `https:`
or ???)
Rowan project load
speci!cation
(3 of 3)
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’, ‘tests’, ‘examples’ ],
#comment : 'Sample project load specification'
}
Rowan con!gurations
(1 of 3)
● Named
● The minimum loadable unit for Rowan
● Located in the `configs` directory
● Declares the set of packages to be loaded
– Expected to define loadable subsystems
– Should include ‘core’ and ‘tests’
Rowan con!gurations
(2 of 3)
● Specifies nested configurations and external project
references
● May be recursive
● Instance-based (declarative)
– Stored as STON on disk
– Potential for multiple implementations
● depending upon needs of project
● Support future expansion
Fine print: RwProjectReferenceConfiguration not yet implemented
Rowan con!gurations
(3 of 3)
RwProjectCompoundConfiguration{
#name : 'Core',
#packageNames : [
'RowanSample1-Core',
'RowanSample1-Extensions',
'RowanSample1-Tests'
],
#comment : 'Project packages'
}
Rowan External Project
References
(1 of 2)
● Named
● References a `project load specification` url
● Optionally specifies overrides for referenced
`project load specification`
● A “kind of” configuration
– Resolves to project(s) and packages added to the load
list
Fine print: RwProjectReferenceConfiguration not yet implemented
Rowan External Project
References
(2 of 2)
RwProjectReferenceConfiguration{
#name : 'FileSystem',
#projectSpecUrl : 'https://raw.githubusercontent.com/GemTalk/FileSystem/master/rowan/specs/FileSystem.ston ',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames : [‘core’, ‘examples’ ],
#comment : 'Reference to the FileSystem project' }
Fine print: RwProjectReferenceConfiguration not yet implemented
…
Updated Monticello
(1 of 2)
● Definition-based package reader/writer focused
exclusively on Filetree and Tonel
● Set of definitions expanded to include package and
project definitions
● Atomic project loading
…
Updated Monticello
(2 of 2)
● First class objects representing loaded
project/package/class/method
● Loaded “things” directly updated by the project
loader
● Every class and method “knows” which
package/project it is a member of without
expensive lookup
projectName := ‘Project’.
packageName1 := ‘Project-Core’.
packageName2 := ‘Project-Extensions’.
"create project"
projectDefinition := Rowan projectTools create
createDiskBasedProjectDefinition: projectName
packageNames: { packageName1. packageName2 }
format: ‘tonel’
root: ‘$ROWAN_PROJECTS_HOME’.
“create project content”
“...Following slides ...”
"load project definition"
Rowan projectTools load
loadProjectDefinition: projectDefinition.
Rowan de!nitions API
create/load
(1 of 3)
"create classes and methods"
classDefinition := (RwClassDefinition
newForClassNamed: ’MyClass’
super: 'Object'
instvars: #()
classinstvars: #()
classvars: #()
category: ‘MyCategory’
comment: ''
pools: #()
type: 'normal')
addInstanceMethodDefinition:
(RwMethodDefinition
newForSource: 'method1 ^1'
protocol: 'accessing').
(projectDefinition packageNamed: packageName1)
addClassDefinition: classDefinition.
Rowan de!nitions API
class/method creation
(2 of 3)
"create classes extension methods"
classExtensionDefinition :=
(RwClassExtensionDefinition newForClassNamed: 'Object')
addInstanceMethodDefinition:
(RwMethodDefinition
newForSource: 'extension1 ^1'
protocol: 'accessing');
yourself.
(projectDefinition packageNamed: packageName2)
addClassExtension: classExtensionDefinition.
Rowan de!nitions API
extension method creation
(3 of 3)
…
Replacement for Metacello
Comparison between Metacello and Rowan
Rowan project loading
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
https://raw.githubusercontent.com/GemTalk/Rowan/master/samples/RowanSample1.ston
Monticello new
baseline: 'RowanSample1';
repository: 'github://dalehenrich/RowanSample1:sample/rowan/src';
load: #( ‘core’ )
url := ‘file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston’.
Rowan projectTools load
loadProjectFromSpecUrl: url.
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’ ],
#comment : 'Sample project load specification'
}
RwSimpleProjectSpeci!cation
Monticello new
baseline: 'RowanSample1';
repository: 'github://dalehenrich/RowanSample1:sample/rowan/src';
load: #( ‘core’ )
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’ ],
#comment : 'Sample project load specification'
}
…
RwSimpleProjectSpeci!cation
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’ ],
#comment : 'Sample project load specification'
}
…
RwSimpleProjectSpeci!cation
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
baseline: spec
<baseline>
spec
for: #'common'
do: [
spec
package: 'RowanSample4-Core';
package: 'RowanSample4-Extensions'
with: [ spec requires: 'RowanSample4-Core' ];
package: 'RowanSample1-Tests'
with: [ spec requires: 'RowanSample4-Extensions' ].
spec
group: 'Core' with: #('RowanSample4-Core' 'RowanSample4-Extensions');
group: 'Tests' with: #('RowanSample1-Tests') ]
BaselineOfRowanSample1
packages and groups
…
Rowan Con!gurations
file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/Core.ston
RwProjectLoadConfiguration{
#name : 'Core',
#definedGroupNames : {
'Core’ : [],
'Tests’ : [ 'Core’ ] },
#conditionalPackages: {
[ 'common' ] :
{ 'Core': {
#packageNames : [
'RowanSample4-Core',
'RowanSample4-Extensions' ] } },
{ 'Tests': {
#packageNames : [
'RowanSample4-Tests' ] } } },
#comment : 'conditional packages'
}
…
Rowan Con!gurations
RwProjectLoadConfiguration{
#name : 'Core',
#configurationNames : [ 'Test' ],
#comment : ‘Platform independent configuration for RowanSample1.' }
RwProjectLoadConfiguration{
#name : 'Test',
#conditionalPackages: {
[ 'common' ] : { 'Tests': {
#packageNames : [
'RowanSample1-Tests’ ] } } },
#configurationNames : [ ‘Common' ],
#comment : 'Platform independent Test packages.' }
RwProjectLoadConfiguration{
#name : 'Common',
#conditionalPackages: {
[ 'common' ] : { 'Core': {
#packageNames : [
'RowanSample1-Core',
'RowanSample1-Extensions' ] } } },
#configurationNames : [ ],
#comment : 'Platform independent packages' }
file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/*
Rowan/Jadeite Plans
(near term)
● Keep our production customer happy
● Implement missing features in both Rowan and
Jadeite
● Rowan support in SmalltalkCI
● Port FileSystem and parts of Zinc to GemStone
kernel
● Port Rowan to 3.4
– Upgrade path from 3.2.15 to 3.4
Rowan/Jadeite Plans
(long term)
● Port Rowan to GemStone 3.5
● Package kernel classes for 3.5/3.6
● Create a Pharo-based GUI using servicesAPI
created for Jadeite
● Integrate Rowan with tODE, GLASS/GsDevKit,
GsDevKit_home
● Review/Refactor for dialect portability
Rowan: A new project/package
manager
Jadeite: A Development client
for Rowan and GemStone/S
Dale Henrichs
GemTalk Systems
ESUG 2018
Rowan and Jadeite are part of GemTalk’s effort to provide a
supported development environment for GemStone/S.
Rowan and Jadeite were developed in cooperation with one
of our commercial customers over the better part of this
year and is currently in production at the customer’s site.
Rowan is designed to be support multiple Smalltalk dialects
Jadeite
Jadeite is a Dolphin-based client that implements a browser,
inspector, debugger, etc. that supports the Rowan
project/package model.
Jadeite is derived from Jade by James Foster
Our client is a windows shop, so Rowanizing Jade was the
fastest route to a functional client for Rowan.
Jadeite is a thin client, with most of the business logic for
browsers and debuggers running on the server
Jadeite basic support for git-based projects.
Current Rowan Status
● In production at a GemTalk customer site
● Running on Gemstone/S 3.2.15
● Still not quite feature complete
Current Jadeite Status
● Customer is currently using an early Alpha Jadeite
for development
● Plan to release to customer a new JadeiteAlpha
● Jadeite runs on Windows, but can be used on a Mac
with Wine installed.
Rowan
Rowan is an updated implementation of Monticello and
awholesale replacement for Metacello.
Monticello is 15 years old, Metacello
is 10 years old and the software
management world for Smalltalk
has changed significantly since they
were both created.
FileTree, Tonel, Git support, and
STON did not exist when
Monticello and Metacello were first
created.
Rowan Structure
Project
– Configurations
● Configurations
● External Project References
● Packages
– Classes
● Methods
– Class Extensions
● Methods
Fine print: External project references not yet implemented
Multiple projects per image
Configurations provide organization for
packages
Packages are similar to what you are used to
with Monticello
Now I’ll talk a bit more some of these newer
structural elements
Rowan project
(in image)
● Named
● Associated with a set of directories on disk
● SCM neutral, but Git aware
● Loaded using a `project load specification`
Rowan project load
speci!cation
(1 of 3)
● Named
● Specifies disk structure:
– src directory for packages
– configs directory for configurations
– specs directory for load specs
● Specifies load parameters
– List of configuration names and group names
– Remote repository specifics
Rowan project load
speci!cation
(2 of 3)
● Instance-based (declarative)
– Stored as STON on disk
– Potential for multiple implementations
● depending upon needs of project
● Support future expansion
● Located anywhere
– Meant to be copied and customized
– Typically reference via an url (`file:` or `https:`
or ???)
Rowan project load
speci!cation
(3 of 3)
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’, ‘tests’, ‘examples’ ],
#comment : 'Sample project load specification'
}
This is a (obviously) a STON file and as such
is pretty readable …
I will cover the specific fields in more detail
later.
Rowan con!gurations
(1 of 3)
● Named
● The minimum loadable unit for Rowan
● Located in the `configs` directory
● Declares the set of packages to be loaded
– Expected to define loadable subsystems
– Should include ‘core’ and ‘tests’
With Metacello you are allowed to load a single
package from a baseline … but there is no
guarantee that things will work.
With a configuration there is an explicit contract
between project owners and project users about
what combinations of packages are supported
Rowan con!gurations
(2 of 3)
● Specifies nested configurations and external project
references
● May be recursive
● Instance-based (declarative)
– Stored as STON on disk
– Potential for multiple implementations
● depending upon needs of project
● Support future expansion
Fine print: RwProjectReferenceConfiguration not yet implemented
FINE PRINT
Rowan con!gurations
(3 of 3)
RwProjectCompoundConfiguration{
#name : 'Core',
#packageNames : [
'RowanSample1-Core',
'RowanSample1-Extensions',
'RowanSample1-Tests'
],
#comment : 'Project packages'
}
Example of simplest configuration possible
…. a list of 3 packages.
I will show a few more complicated
configration options later on...
Rowan External Project
References
(1 of 2)
● Named
● References a `project load specification` url
● Optionally specifies overrides for referenced
`project load specification`
● A “kind of” configuration
– Resolves to project(s) and packages added to the load
list
Fine print: RwProjectReferenceConfiguration not yet implemented
FINE PRINT!
Rowan External Project
References
(2 of 2)
RwProjectReferenceConfiguration{
#name : 'FileSystem',
#projectSpecUrl : 'https://raw.githubusercontent.com/GemTalk/FileSystem/master/rowan/specs/FileSystem.ston',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames : [‘core’, ‘examples’ ],
#comment : 'Reference to the FileSystem project' }
Fine print: RwProjectReferenceConfiguration not yet implemented
FINE PRINT
The tiny url is a direct https: reference to the
STON file in the specs directory of a
GitHub project.
The reference will load the Core
configuration using the core and examples
groups (presumably not loading the tests
group)
…
Updated Monticello
(1 of 2)
● Definition-based package reader/writer focused
exclusively on Filetree and Tonel
● Set of definitions expanded to include package and
project definitions
● Atomic project loading
Done with Structure …
This is for the Monticello nerds in th
audience:)
… yes Rowan is really a project loader and a
collection of projects can be loaded in one
atomic operation
…
Updated Monticello
(2 of 2)
● First class objects representing loaded
project/package/class/method
● Loaded “things” directly updated by the project
loader
● Every class and method “knows” which
package/project it is a member of without
expensive lookup
For the very large projects we see in
GemStone, it isn’t practical to scan all
classes and methods in the image to
determine package membership
And this is one of the reasons we felt it
necessary to update Monticello
projectName := ‘Project’.
packageName1 := ‘Project-Core’.
packageName2 := ‘Project-Extensions’.
"create project"
projectDefinition := Rowan projectTools create
createDiskBasedProjectDefinition: projectName
packageNames: { packageName1. packageName2 }
format: ‘tonel’
root: ‘$ROWAN_PROJECTS_HOME’.
“create project content”
“...Following slides ...”
"load project definition"
Rowan projectTools load
loadProjectDefinition: projectDefinition.
Rowan de!nitions API
create/load
(1 of 3)
Here we are creating a project definition of a certain type
(disk base –- no SCM)
$ROWAN_PROJECTS_HOME is an evironment variable
that I’m using to indicate the home directory for git clones
…
#loadedProjectDefinition: is a fundamental operation and the
important thing to note here is that when doing a load,
there is no expectation of where the project definition has
come from …
It could be disk, it could be created programatically as in this
example.
"create classes and methods"
classDefinition := (RwClassDefinition
newForClassNamed: ’MyClass’
super: 'Object'
instvars: #()
classinstvars: #()
classvars: #()
category: ‘MyCategory’
comment: ''
pools: #()
type: 'normal')
addInstanceMethodDefinition:
(RwMethodDefinition
newForSource: 'method1 ^1'
protocol: 'accessing').
(projectDefinition packageNamed: packageName1)
addClassDefinition: classDefinition.
Rowan de!nitions API
class/method creation
(2 of 3)
Another slide for the Monticello nerds …
It’s actually fun to work with Rowan
definitions ...
"create classes extension methods"
classExtensionDefinition :=
(RwClassExtensionDefinition newForClassNamed: 'Object')
addInstanceMethodDefinition:
(RwMethodDefinition
newForSource: 'extension1 ^1'
protocol: 'accessing');
yourself.
(projectDefinition packageNamed: packageName2)
addClassExtension: classExtensionDefinition.
Rowan de!nitions API
extension method creation
(3 of 3)
There is a corresponding
#addClassMethodDefinition: method ...
…
Replacement for Metacello
Comparison between Metacello and Rowan
Rowan project loading
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
https://raw.githubusercontent.com/GemTalk/Rowan/master/samples/RowanSample1.ston
Monticello new
baseline: 'RowanSample1';
repository: 'github://dalehenrich/RowanSample1:sample/rowan/src';
load: #( ‘core’ )
url := ‘file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston’.
Rowan projectTools load
loadProjectFromSpecUrl: url.
The first change with Rowan is how projects are loaded.
The functionality of Metacello has been absorbed into
Rowan, so the need for a meta-load expression is gone.
The (familiar) Metacello load expression is replaced by a
project load specification URL…
The url may reference a STON file on disk, or a STON file
on the network.
The STON file itself is project load specification...
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’ ],
#comment : 'Sample project load specification'
}
RwSimpleProjectSpeci!cation
Monticello new
baseline: 'RowanSample1';
repository: 'github://dalehenrich/RowanSample1:sample/rowan/src';
load: #( ‘core’ )
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
Now we look into the guts of the project load
specification.
The highlighted bits shows the
correspondence to information provided in
Metacello load expression and the Rowan
load specification…
Rowan preserves the basic sematics of the
Metacello load expression
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’ ],
#comment : 'Sample project load specification'
}
…
RwSimpleProjectSpeci!cation
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
The params specify project directory
structure.
The use of separate directories for the Rowan
configs and specs means that a project can
be Rowanized non-invasively…
RwSimpleProjectSpecification{
#specName : 'RowanSample1',
#projectUrl : 'https://github.com/dalehenrich/RowanSample1',
#repoSpec : RwGitRepositorySpecification {
#committish : 'sample',
#committishType : 'branch'
},
#configsPath : 'rowan/configs',
#repoPath : 'rowan/src',
#specsPath : 'rowan/specs',
#defaultConfigurationNames : [ 'Core' ],
#defaultGroupNames: [ ‘core’ ],
#comment : 'Sample project load specification'
}
…
RwSimpleProjectSpeci!cation
file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
The default config names and group names
allow project maintainers to recommend a
starting point …
It’s worth noting that since specs are in a
directory, maintainers can recommend
multiple specification/configurations.
baseline: spec
<baseline>
spec
for: #'common'
do: [
spec
package: 'RowanSample4-Core';
package: 'RowanSample4-Extensions'
with: [ spec requires: 'RowanSample4-Core' ];
package: 'RowanSample1-Tests'
with: [ spec requires: 'RowanSample4-Extensions' ].
spec
group: 'Core' with: #('RowanSample4-Core' 'RowanSample4-Extensions');
group: 'Tests' with: #('RowanSample1-Tests') ]
BaselineOfRowanSample1
packages and groups
Now we’ll look at the differences between a
Metacello BaselineOf and a Rowan
configuration
This baseline has 3 packages and 2 groups ...
…
Rowan Con!gurations
file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/Core.ston
RwProjectLoadConfiguration{
#name : 'Core',
#definedGroupNames : {
'Core’ : [],
'Tests’ : [ 'Core’ ] },
#conditionalPackages: {
[ 'common' ] :
{ 'Core': {
#packageNames : [
'RowanSample4-Core',
'RowanSample4-Extensions' ] } },
{ 'Tests': {
#packageNames : [
'RowanSample4-Tests' ] } } },
#comment : 'conditional packages'
}
This is a slightly more complicated configuration implementation
than you saw earlier ..
In this case we have the platform defined as ‘common’ and
packages are directly gathered together into groups.
What is missing from Metacello is package dependencies
With atomic loads, dependencies aren’t required
If package dependencies are needed, a more complicated
specification class can be defined to permit it …
It’s worth mentioning at this point that an advantage to going with
the instance-based approach is that it’s possible to analyze
configurations with non-Rowan tools … and configuration
implemantations can contain project/dialect specific attributes
…
Rowan Con!gurations
RwProjectLoadConfiguration{
#name : 'Core',
#configurationNames : [ 'Test' ],
#comment : ‘Platform independent configuration for RowanSample1.' }
RwProjectLoadConfiguration{
#name : 'Test',
#conditionalPackages: {
[ 'common' ] : { 'Tests': {
#packageNames : [
'RowanSample1-Tests’ ] } } },
#configurationNames : [ ‘Common' ],
#comment : 'Platform independent Test packages.' }
RwProjectLoadConfiguration{
#name : 'Common',
#conditionalPackages: {
[ 'common' ] : { 'Core': {
#packageNames : [
'RowanSample1-Core',
'RowanSample1-Extensions' ] } } },
#configurationNames : [ ],
#comment : 'Platform independent packages' }
file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/*
The final bit I want to show is that
configurations can be nested to provide
additional structure for projects that have a
large number of packages…
Worth noting that that the plan is to display
the configuration structures in Jadeite...
Rowan/Jadeite Plans
(near term)
● Keep our production customer happy
● Implement missing features in both Rowan and
Jadeite
● Rowan support in SmalltalkCI
● Port FileSystem and parts of Zinc to GemStone
kernel
● Port Rowan to 3.4
– Upgrade path from 3.2.15 to 3.4
Rowan/Jadeite Plans
(long term)
● Port Rowan to GemStone 3.5
● Package kernel classes for 3.5/3.6
● Create a Pharo-based GUI using servicesAPI
created for Jadeite
● Integrate Rowan with tODE, GLASS/GsDevKit,
GsDevKit_home
● Review/Refactor for dialect portability

Weitere ähnliche Inhalte

Was ist angesagt?

还原Oracle中真实的cache recovery
还原Oracle中真实的cache recovery还原Oracle中真实的cache recovery
还原Oracle中真实的cache recoverymaclean liu
 
Introduction to java servlet 3.0 api javaone 2009
Introduction to java servlet 3.0 api javaone 2009Introduction to java servlet 3.0 api javaone 2009
Introduction to java servlet 3.0 api javaone 2009JavaEE Trainers
 
Exam 1z0 062 Oracle Database 12c: Installation and Administration
Exam 1z0 062 Oracle Database 12c: Installation and AdministrationExam 1z0 062 Oracle Database 12c: Installation and Administration
Exam 1z0 062 Oracle Database 12c: Installation and AdministrationKylieJonathan
 
Developing Drizzle Replication Plugins
Developing Drizzle Replication PluginsDeveloping Drizzle Replication Plugins
Developing Drizzle Replication PluginsPadraig O'Sullivan
 
1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp
1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp
1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocpIsabella789
 
Eclipse Pdt2.0 26.05.2009
Eclipse Pdt2.0 26.05.2009Eclipse Pdt2.0 26.05.2009
Eclipse Pdt2.0 26.05.2009Bastian Feder
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Tomek Kaczanowski
 
Apache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra InternalsApache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra Internalsaaronmorton
 
Asm disk group migration from
Asm disk group migration from Asm disk group migration from
Asm disk group migration from Anar Godjaev
 
Java 10 New Features
Java 10 New FeaturesJava 10 New Features
Java 10 New FeaturesAli BAKAN
 
adding_os_command_capability_to_plsql_with_java_stored_procedures
adding_os_command_capability_to_plsql_with_java_stored_proceduresadding_os_command_capability_to_plsql_with_java_stored_procedures
adding_os_command_capability_to_plsql_with_java_stored_proceduresMary Wagner
 
Gradle For Beginners (Serbian Developer Conference 2013 english)
Gradle For Beginners (Serbian Developer Conference 2013 english)Gradle For Beginners (Serbian Developer Conference 2013 english)
Gradle For Beginners (Serbian Developer Conference 2013 english)Joachim Baumann
 
CMake Talk 2008
CMake Talk 2008CMake Talk 2008
CMake Talk 2008cynapses
 
Petro Gordiievych "From Java 9 to Java 12"
Petro Gordiievych "From Java 9 to Java 12"Petro Gordiievych "From Java 9 to Java 12"
Petro Gordiievych "From Java 9 to Java 12"LogeekNightUkraine
 
MyFaces Extensions Validator r3 News
MyFaces Extensions Validator r3 NewsMyFaces Extensions Validator r3 News
MyFaces Extensions Validator r3 Newsos890
 
Mid term &amp; final- preparation- student-review(Oracle)
Mid term &amp; final- preparation- student-review(Oracle)Mid term &amp; final- preparation- student-review(Oracle)
Mid term &amp; final- preparation- student-review(Oracle)than sare
 
Presenting CalDAV (draft 1)
Presenting CalDAV (draft 1)Presenting CalDAV (draft 1)
Presenting CalDAV (draft 1)Roberto Polli
 

Was ist angesagt? (20)

还原Oracle中真实的cache recovery
还原Oracle中真实的cache recovery还原Oracle中真实的cache recovery
还原Oracle中真实的cache recovery
 
Introduction to java servlet 3.0 api javaone 2009
Introduction to java servlet 3.0 api javaone 2009Introduction to java servlet 3.0 api javaone 2009
Introduction to java servlet 3.0 api javaone 2009
 
Exam 1z0 062 Oracle Database 12c: Installation and Administration
Exam 1z0 062 Oracle Database 12c: Installation and AdministrationExam 1z0 062 Oracle Database 12c: Installation and Administration
Exam 1z0 062 Oracle Database 12c: Installation and Administration
 
Developing Drizzle Replication Plugins
Developing Drizzle Replication PluginsDeveloping Drizzle Replication Plugins
Developing Drizzle Replication Plugins
 
Cloning 2
Cloning 2Cloning 2
Cloning 2
 
1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp
1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp
1z0 034 exam-upgrade oracle9i10g oca to oracle database 11g ocp
 
Eclipse Pdt2.0 26.05.2009
Eclipse Pdt2.0 26.05.2009Eclipse Pdt2.0 26.05.2009
Eclipse Pdt2.0 26.05.2009
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010
 
Apache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra InternalsApache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra Internals
 
Asm disk group migration from
Asm disk group migration from Asm disk group migration from
Asm disk group migration from
 
2 P Seminar
2 P Seminar2 P Seminar
2 P Seminar
 
Java 10 New Features
Java 10 New FeaturesJava 10 New Features
Java 10 New Features
 
adding_os_command_capability_to_plsql_with_java_stored_procedures
adding_os_command_capability_to_plsql_with_java_stored_proceduresadding_os_command_capability_to_plsql_with_java_stored_procedures
adding_os_command_capability_to_plsql_with_java_stored_procedures
 
Cheatsheet of msdos
Cheatsheet of msdosCheatsheet of msdos
Cheatsheet of msdos
 
Gradle For Beginners (Serbian Developer Conference 2013 english)
Gradle For Beginners (Serbian Developer Conference 2013 english)Gradle For Beginners (Serbian Developer Conference 2013 english)
Gradle For Beginners (Serbian Developer Conference 2013 english)
 
CMake Talk 2008
CMake Talk 2008CMake Talk 2008
CMake Talk 2008
 
Petro Gordiievych "From Java 9 to Java 12"
Petro Gordiievych "From Java 9 to Java 12"Petro Gordiievych "From Java 9 to Java 12"
Petro Gordiievych "From Java 9 to Java 12"
 
MyFaces Extensions Validator r3 News
MyFaces Extensions Validator r3 NewsMyFaces Extensions Validator r3 News
MyFaces Extensions Validator r3 News
 
Mid term &amp; final- preparation- student-review(Oracle)
Mid term &amp; final- preparation- student-review(Oracle)Mid term &amp; final- preparation- student-review(Oracle)
Mid term &amp; final- preparation- student-review(Oracle)
 
Presenting CalDAV (draft 1)
Presenting CalDAV (draft 1)Presenting CalDAV (draft 1)
Presenting CalDAV (draft 1)
 

Ähnlich wie Rowan: A new project/package manager

Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with MavenSid Anand
 
Scala, docker and testing, oh my! mario camou
Scala, docker and testing, oh my! mario camouScala, docker and testing, oh my! mario camou
Scala, docker and testing, oh my! mario camouJ On The Beach
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbtFabio Fumarola
 
Dockerizing the Hard Services: Neutron and Nova
Dockerizing the Hard Services: Neutron and NovaDockerizing the Hard Services: Neutron and Nova
Dockerizing the Hard Services: Neutron and Novaclayton_oneill
 
Java9 and the impact on Maven Projects (JFall 2016)
Java9 and the impact on Maven Projects (JFall 2016)Java9 and the impact on Maven Projects (JFall 2016)
Java9 and the impact on Maven Projects (JFall 2016)Robert Scholte
 
Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9David Calavera
 
Introduction to Maven
Introduction to MavenIntroduction to Maven
Introduction to MavenSperasoft
 
Gradle - time for a new build
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new buildIgor Khotin
 
Extending Build to the Client: A Maven User's Guide to Grunt.js
Extending Build to the Client: A Maven User's Guide to Grunt.jsExtending Build to the Client: A Maven User's Guide to Grunt.js
Extending Build to the Client: A Maven User's Guide to Grunt.jsPetr Jiricka
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
(Re)-Introduction to Maven
(Re)-Introduction to Maven(Re)-Introduction to Maven
(Re)-Introduction to MavenEric Wyles
 
Introduction to maven, its configuration, lifecycle and relationship to JS world
Introduction to maven, its configuration, lifecycle and relationship to JS worldIntroduction to maven, its configuration, lifecycle and relationship to JS world
Introduction to maven, its configuration, lifecycle and relationship to JS worldDmitry Bakaleinik
 
Jenkins advance topic
Jenkins advance topicJenkins advance topic
Jenkins advance topicGourav Varma
 
Introduction of Docker and Docker Compose
Introduction of Docker and Docker ComposeIntroduction of Docker and Docker Compose
Introduction of Docker and Docker ComposeDr. Ketan Parmar
 
Maven introduction in Mule
Maven introduction in MuleMaven introduction in Mule
Maven introduction in MuleShahid Shaik
 

Ähnlich wie Rowan: A new project/package manager (20)

GradleFX
GradleFXGradleFX
GradleFX
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with Maven
 
Scala, docker and testing, oh my! mario camou
Scala, docker and testing, oh my! mario camouScala, docker and testing, oh my! mario camou
Scala, docker and testing, oh my! mario camou
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
 
Dockerizing the Hard Services: Neutron and Nova
Dockerizing the Hard Services: Neutron and NovaDockerizing the Hard Services: Neutron and Nova
Dockerizing the Hard Services: Neutron and Nova
 
Java9 and the impact on Maven Projects (JFall 2016)
Java9 and the impact on Maven Projects (JFall 2016)Java9 and the impact on Maven Projects (JFall 2016)
Java9 and the impact on Maven Projects (JFall 2016)
 
Maven in Mule
Maven in MuleMaven in Mule
Maven in Mule
 
Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9Rubyspec y el largo camino hacia Ruby 1.9
Rubyspec y el largo camino hacia Ruby 1.9
 
Introduction to Maven
Introduction to MavenIntroduction to Maven
Introduction to Maven
 
Gradle - time for a new build
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new build
 
Extending Build to the Client: A Maven User's Guide to Grunt.js
Extending Build to the Client: A Maven User's Guide to Grunt.jsExtending Build to the Client: A Maven User's Guide to Grunt.js
Extending Build to the Client: A Maven User's Guide to Grunt.js
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
(Re)-Introduction to Maven
(Re)-Introduction to Maven(Re)-Introduction to Maven
(Re)-Introduction to Maven
 
Introduction to maven, its configuration, lifecycle and relationship to JS world
Introduction to maven, its configuration, lifecycle and relationship to JS worldIntroduction to maven, its configuration, lifecycle and relationship to JS world
Introduction to maven, its configuration, lifecycle and relationship to JS world
 
Maven
MavenMaven
Maven
 
Maven
MavenMaven
Maven
 
Jenkins advance topic
Jenkins advance topicJenkins advance topic
Jenkins advance topic
 
Introduction of Docker and Docker Compose
Introduction of Docker and Docker ComposeIntroduction of Docker and Docker Compose
Introduction of Docker and Docker Compose
 
Maven introduction in Mule
Maven introduction in MuleMaven introduction in Mule
Maven introduction in Mule
 

Mehr von ESUG

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingESUG
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in PharoESUG
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapESUG
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoESUG
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...ESUG
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsESUG
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6ESUG
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingESUG
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesESUG
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportESUG
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsESUG
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector TuningESUG
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FutureESUG
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerESUG
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing ScoreESUG
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptESUG
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocESUG
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsESUG
 

Mehr von ESUG (20)

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in Pharo
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in Pharo
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector Tuning
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing Score
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design Mooc
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
 

Kürzlich hochgeladen

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusZilliz
 

Kürzlich hochgeladen (20)

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 

Rowan: A new project/package manager

  • 1. Rowan: A new project/package manager Jadeite: A Development client for Rowan and GemStone/S Dale Henrichs GemTalk Systems ESUG 2018
  • 3.
  • 4. Current Rowan Status ● In production at a GemTalk customer site ● Running on Gemstone/S 3.2.15 ● Still not quite feature complete
  • 5. Current Jadeite Status ● Customer is currently using an early Alpha Jadeite for development ● Plan to release to customer a new JadeiteAlpha ● Jadeite runs on Windows, but can be used on a Mac with Wine installed.
  • 6. Rowan Rowan is an updated implementation of Monticello and awholesale replacement for Metacello.
  • 7. Rowan Structure Project – Configurations ● Configurations ● External Project References ● Packages – Classes ● Methods – Class Extensions ● Methods Fine print: External project references not yet implemented
  • 8. Rowan project (in image) ● Named ● Associated with a set of directories on disk ● SCM neutral, but Git aware ● Loaded using a `project load specification`
  • 9. Rowan project load speci!cation (1 of 3) ● Named ● Specifies disk structure: – src directory for packages – configs directory for configurations – specs directory for load specs ● Specifies load parameters – List of configuration names and group names – Remote repository specifics
  • 10. Rowan project load speci!cation (2 of 3) ● Instance-based (declarative) – Stored as STON on disk – Potential for multiple implementations ● depending upon needs of project ● Support future expansion ● Located anywhere – Meant to be copied and customized – Typically reference via an url (`file:` or `https:` or ???)
  • 11. Rowan project load speci!cation (3 of 3) RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’, ‘tests’, ‘examples’ ], #comment : 'Sample project load specification' }
  • 12. Rowan con!gurations (1 of 3) ● Named ● The minimum loadable unit for Rowan ● Located in the `configs` directory ● Declares the set of packages to be loaded – Expected to define loadable subsystems – Should include ‘core’ and ‘tests’
  • 13. Rowan con!gurations (2 of 3) ● Specifies nested configurations and external project references ● May be recursive ● Instance-based (declarative) – Stored as STON on disk – Potential for multiple implementations ● depending upon needs of project ● Support future expansion Fine print: RwProjectReferenceConfiguration not yet implemented
  • 14. Rowan con!gurations (3 of 3) RwProjectCompoundConfiguration{ #name : 'Core', #packageNames : [ 'RowanSample1-Core', 'RowanSample1-Extensions', 'RowanSample1-Tests' ], #comment : 'Project packages' }
  • 15. Rowan External Project References (1 of 2) ● Named ● References a `project load specification` url ● Optionally specifies overrides for referenced `project load specification` ● A “kind of” configuration – Resolves to project(s) and packages added to the load list Fine print: RwProjectReferenceConfiguration not yet implemented
  • 16. Rowan External Project References (2 of 2) RwProjectReferenceConfiguration{ #name : 'FileSystem', #projectSpecUrl : 'https://raw.githubusercontent.com/GemTalk/FileSystem/master/rowan/specs/FileSystem.ston ', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames : [‘core’, ‘examples’ ], #comment : 'Reference to the FileSystem project' } Fine print: RwProjectReferenceConfiguration not yet implemented
  • 17. … Updated Monticello (1 of 2) ● Definition-based package reader/writer focused exclusively on Filetree and Tonel ● Set of definitions expanded to include package and project definitions ● Atomic project loading
  • 18. … Updated Monticello (2 of 2) ● First class objects representing loaded project/package/class/method ● Loaded “things” directly updated by the project loader ● Every class and method “knows” which package/project it is a member of without expensive lookup
  • 19. projectName := ‘Project’. packageName1 := ‘Project-Core’. packageName2 := ‘Project-Extensions’. "create project" projectDefinition := Rowan projectTools create createDiskBasedProjectDefinition: projectName packageNames: { packageName1. packageName2 } format: ‘tonel’ root: ‘$ROWAN_PROJECTS_HOME’. “create project content” “...Following slides ...” "load project definition" Rowan projectTools load loadProjectDefinition: projectDefinition. Rowan de!nitions API create/load (1 of 3)
  • 20. "create classes and methods" classDefinition := (RwClassDefinition newForClassNamed: ’MyClass’ super: 'Object' instvars: #() classinstvars: #() classvars: #() category: ‘MyCategory’ comment: '' pools: #() type: 'normal') addInstanceMethodDefinition: (RwMethodDefinition newForSource: 'method1 ^1' protocol: 'accessing'). (projectDefinition packageNamed: packageName1) addClassDefinition: classDefinition. Rowan de!nitions API class/method creation (2 of 3)
  • 21. "create classes extension methods" classExtensionDefinition := (RwClassExtensionDefinition newForClassNamed: 'Object') addInstanceMethodDefinition: (RwMethodDefinition newForSource: 'extension1 ^1' protocol: 'accessing'); yourself. (projectDefinition packageNamed: packageName2) addClassExtension: classExtensionDefinition. Rowan de!nitions API extension method creation (3 of 3)
  • 22. … Replacement for Metacello Comparison between Metacello and Rowan
  • 23. Rowan project loading file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston https://raw.githubusercontent.com/GemTalk/Rowan/master/samples/RowanSample1.ston Monticello new baseline: 'RowanSample1'; repository: 'github://dalehenrich/RowanSample1:sample/rowan/src'; load: #( ‘core’ ) url := ‘file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston’. Rowan projectTools load loadProjectFromSpecUrl: url.
  • 24. RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’ ], #comment : 'Sample project load specification' } RwSimpleProjectSpeci!cation Monticello new baseline: 'RowanSample1'; repository: 'github://dalehenrich/RowanSample1:sample/rowan/src'; load: #( ‘core’ ) file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
  • 25. RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’ ], #comment : 'Sample project load specification' } … RwSimpleProjectSpeci!cation file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
  • 26. RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’ ], #comment : 'Sample project load specification' } … RwSimpleProjectSpeci!cation file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston
  • 27. baseline: spec <baseline> spec for: #'common' do: [ spec package: 'RowanSample4-Core'; package: 'RowanSample4-Extensions' with: [ spec requires: 'RowanSample4-Core' ]; package: 'RowanSample1-Tests' with: [ spec requires: 'RowanSample4-Extensions' ]. spec group: 'Core' with: #('RowanSample4-Core' 'RowanSample4-Extensions'); group: 'Tests' with: #('RowanSample1-Tests') ] BaselineOfRowanSample1 packages and groups
  • 28. … Rowan Con!gurations file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/Core.ston RwProjectLoadConfiguration{ #name : 'Core', #definedGroupNames : { 'Core’ : [], 'Tests’ : [ 'Core’ ] }, #conditionalPackages: { [ 'common' ] : { 'Core': { #packageNames : [ 'RowanSample4-Core', 'RowanSample4-Extensions' ] } }, { 'Tests': { #packageNames : [ 'RowanSample4-Tests' ] } } }, #comment : 'conditional packages' }
  • 29. … Rowan Con!gurations RwProjectLoadConfiguration{ #name : 'Core', #configurationNames : [ 'Test' ], #comment : ‘Platform independent configuration for RowanSample1.' } RwProjectLoadConfiguration{ #name : 'Test', #conditionalPackages: { [ 'common' ] : { 'Tests': { #packageNames : [ 'RowanSample1-Tests’ ] } } }, #configurationNames : [ ‘Common' ], #comment : 'Platform independent Test packages.' } RwProjectLoadConfiguration{ #name : 'Common', #conditionalPackages: { [ 'common' ] : { 'Core': { #packageNames : [ 'RowanSample1-Core', 'RowanSample1-Extensions' ] } } }, #configurationNames : [ ], #comment : 'Platform independent packages' } file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/*
  • 30. Rowan/Jadeite Plans (near term) ● Keep our production customer happy ● Implement missing features in both Rowan and Jadeite ● Rowan support in SmalltalkCI ● Port FileSystem and parts of Zinc to GemStone kernel ● Port Rowan to 3.4 – Upgrade path from 3.2.15 to 3.4
  • 31. Rowan/Jadeite Plans (long term) ● Port Rowan to GemStone 3.5 ● Package kernel classes for 3.5/3.6 ● Create a Pharo-based GUI using servicesAPI created for Jadeite ● Integrate Rowan with tODE, GLASS/GsDevKit, GsDevKit_home ● Review/Refactor for dialect portability
  • 32. Rowan: A new project/package manager Jadeite: A Development client for Rowan and GemStone/S Dale Henrichs GemTalk Systems ESUG 2018 Rowan and Jadeite are part of GemTalk’s effort to provide a supported development environment for GemStone/S. Rowan and Jadeite were developed in cooperation with one of our commercial customers over the better part of this year and is currently in production at the customer’s site. Rowan is designed to be support multiple Smalltalk dialects
  • 33. Jadeite Jadeite is a Dolphin-based client that implements a browser, inspector, debugger, etc. that supports the Rowan project/package model. Jadeite is derived from Jade by James Foster Our client is a windows shop, so Rowanizing Jade was the fastest route to a functional client for Rowan. Jadeite is a thin client, with most of the business logic for browsers and debuggers running on the server
  • 34. Jadeite basic support for git-based projects.
  • 35. Current Rowan Status ● In production at a GemTalk customer site ● Running on Gemstone/S 3.2.15 ● Still not quite feature complete
  • 36. Current Jadeite Status ● Customer is currently using an early Alpha Jadeite for development ● Plan to release to customer a new JadeiteAlpha ● Jadeite runs on Windows, but can be used on a Mac with Wine installed.
  • 37. Rowan Rowan is an updated implementation of Monticello and awholesale replacement for Metacello. Monticello is 15 years old, Metacello is 10 years old and the software management world for Smalltalk has changed significantly since they were both created. FileTree, Tonel, Git support, and STON did not exist when Monticello and Metacello were first created.
  • 38. Rowan Structure Project – Configurations ● Configurations ● External Project References ● Packages – Classes ● Methods – Class Extensions ● Methods Fine print: External project references not yet implemented Multiple projects per image Configurations provide organization for packages Packages are similar to what you are used to with Monticello Now I’ll talk a bit more some of these newer structural elements
  • 39. Rowan project (in image) ● Named ● Associated with a set of directories on disk ● SCM neutral, but Git aware ● Loaded using a `project load specification`
  • 40. Rowan project load speci!cation (1 of 3) ● Named ● Specifies disk structure: – src directory for packages – configs directory for configurations – specs directory for load specs ● Specifies load parameters – List of configuration names and group names – Remote repository specifics
  • 41. Rowan project load speci!cation (2 of 3) ● Instance-based (declarative) – Stored as STON on disk – Potential for multiple implementations ● depending upon needs of project ● Support future expansion ● Located anywhere – Meant to be copied and customized – Typically reference via an url (`file:` or `https:` or ???)
  • 42. Rowan project load speci!cation (3 of 3) RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’, ‘tests’, ‘examples’ ], #comment : 'Sample project load specification' } This is a (obviously) a STON file and as such is pretty readable … I will cover the specific fields in more detail later.
  • 43. Rowan con!gurations (1 of 3) ● Named ● The minimum loadable unit for Rowan ● Located in the `configs` directory ● Declares the set of packages to be loaded – Expected to define loadable subsystems – Should include ‘core’ and ‘tests’ With Metacello you are allowed to load a single package from a baseline … but there is no guarantee that things will work. With a configuration there is an explicit contract between project owners and project users about what combinations of packages are supported
  • 44. Rowan con!gurations (2 of 3) ● Specifies nested configurations and external project references ● May be recursive ● Instance-based (declarative) – Stored as STON on disk – Potential for multiple implementations ● depending upon needs of project ● Support future expansion Fine print: RwProjectReferenceConfiguration not yet implemented FINE PRINT
  • 45. Rowan con!gurations (3 of 3) RwProjectCompoundConfiguration{ #name : 'Core', #packageNames : [ 'RowanSample1-Core', 'RowanSample1-Extensions', 'RowanSample1-Tests' ], #comment : 'Project packages' } Example of simplest configuration possible …. a list of 3 packages. I will show a few more complicated configration options later on...
  • 46. Rowan External Project References (1 of 2) ● Named ● References a `project load specification` url ● Optionally specifies overrides for referenced `project load specification` ● A “kind of” configuration – Resolves to project(s) and packages added to the load list Fine print: RwProjectReferenceConfiguration not yet implemented FINE PRINT!
  • 47. Rowan External Project References (2 of 2) RwProjectReferenceConfiguration{ #name : 'FileSystem', #projectSpecUrl : 'https://raw.githubusercontent.com/GemTalk/FileSystem/master/rowan/specs/FileSystem.ston', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames : [‘core’, ‘examples’ ], #comment : 'Reference to the FileSystem project' } Fine print: RwProjectReferenceConfiguration not yet implemented FINE PRINT The tiny url is a direct https: reference to the STON file in the specs directory of a GitHub project. The reference will load the Core configuration using the core and examples groups (presumably not loading the tests group)
  • 48. … Updated Monticello (1 of 2) ● Definition-based package reader/writer focused exclusively on Filetree and Tonel ● Set of definitions expanded to include package and project definitions ● Atomic project loading Done with Structure … This is for the Monticello nerds in th audience:) … yes Rowan is really a project loader and a collection of projects can be loaded in one atomic operation
  • 49. … Updated Monticello (2 of 2) ● First class objects representing loaded project/package/class/method ● Loaded “things” directly updated by the project loader ● Every class and method “knows” which package/project it is a member of without expensive lookup For the very large projects we see in GemStone, it isn’t practical to scan all classes and methods in the image to determine package membership And this is one of the reasons we felt it necessary to update Monticello
  • 50. projectName := ‘Project’. packageName1 := ‘Project-Core’. packageName2 := ‘Project-Extensions’. "create project" projectDefinition := Rowan projectTools create createDiskBasedProjectDefinition: projectName packageNames: { packageName1. packageName2 } format: ‘tonel’ root: ‘$ROWAN_PROJECTS_HOME’. “create project content” “...Following slides ...” "load project definition" Rowan projectTools load loadProjectDefinition: projectDefinition. Rowan de!nitions API create/load (1 of 3) Here we are creating a project definition of a certain type (disk base –- no SCM) $ROWAN_PROJECTS_HOME is an evironment variable that I’m using to indicate the home directory for git clones … #loadedProjectDefinition: is a fundamental operation and the important thing to note here is that when doing a load, there is no expectation of where the project definition has come from … It could be disk, it could be created programatically as in this example.
  • 51. "create classes and methods" classDefinition := (RwClassDefinition newForClassNamed: ’MyClass’ super: 'Object' instvars: #() classinstvars: #() classvars: #() category: ‘MyCategory’ comment: '' pools: #() type: 'normal') addInstanceMethodDefinition: (RwMethodDefinition newForSource: 'method1 ^1' protocol: 'accessing'). (projectDefinition packageNamed: packageName1) addClassDefinition: classDefinition. Rowan de!nitions API class/method creation (2 of 3) Another slide for the Monticello nerds … It’s actually fun to work with Rowan definitions ...
  • 52. "create classes extension methods" classExtensionDefinition := (RwClassExtensionDefinition newForClassNamed: 'Object') addInstanceMethodDefinition: (RwMethodDefinition newForSource: 'extension1 ^1' protocol: 'accessing'); yourself. (projectDefinition packageNamed: packageName2) addClassExtension: classExtensionDefinition. Rowan de!nitions API extension method creation (3 of 3) There is a corresponding #addClassMethodDefinition: method ...
  • 53. … Replacement for Metacello Comparison between Metacello and Rowan
  • 54. Rowan project loading file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston https://raw.githubusercontent.com/GemTalk/Rowan/master/samples/RowanSample1.ston Monticello new baseline: 'RowanSample1'; repository: 'github://dalehenrich/RowanSample1:sample/rowan/src'; load: #( ‘core’ ) url := ‘file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston’. Rowan projectTools load loadProjectFromSpecUrl: url. The first change with Rowan is how projects are loaded. The functionality of Metacello has been absorbed into Rowan, so the need for a meta-load expression is gone. The (familiar) Metacello load expression is replaced by a project load specification URL… The url may reference a STON file on disk, or a STON file on the network. The STON file itself is project load specification...
  • 55. RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’ ], #comment : 'Sample project load specification' } RwSimpleProjectSpeci!cation Monticello new baseline: 'RowanSample1'; repository: 'github://dalehenrich/RowanSample1:sample/rowan/src'; load: #( ‘core’ ) file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston Now we look into the guts of the project load specification. The highlighted bits shows the correspondence to information provided in Metacello load expression and the Rowan load specification… Rowan preserves the basic sematics of the Metacello load expression
  • 56. RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’ ], #comment : 'Sample project load specification' } … RwSimpleProjectSpeci!cation file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston The params specify project directory structure. The use of separate directories for the Rowan configs and specs means that a project can be Rowanized non-invasively…
  • 57. RwSimpleProjectSpecification{ #specName : 'RowanSample1', #projectUrl : 'https://github.com/dalehenrich/RowanSample1', #repoSpec : RwGitRepositorySpecification { #committish : 'sample', #committishType : 'branch' }, #configsPath : 'rowan/configs', #repoPath : 'rowan/src', #specsPath : 'rowan/specs', #defaultConfigurationNames : [ 'Core' ], #defaultGroupNames: [ ‘core’ ], #comment : 'Sample project load specification' } … RwSimpleProjectSpeci!cation file:$ROWAN_PROJECTS_HOME/Rowan/samples/RowanSample1.ston The default config names and group names allow project maintainers to recommend a starting point … It’s worth noting that since specs are in a directory, maintainers can recommend multiple specification/configurations.
  • 58. baseline: spec <baseline> spec for: #'common' do: [ spec package: 'RowanSample4-Core'; package: 'RowanSample4-Extensions' with: [ spec requires: 'RowanSample4-Core' ]; package: 'RowanSample1-Tests' with: [ spec requires: 'RowanSample4-Extensions' ]. spec group: 'Core' with: #('RowanSample4-Core' 'RowanSample4-Extensions'); group: 'Tests' with: #('RowanSample1-Tests') ] BaselineOfRowanSample1 packages and groups Now we’ll look at the differences between a Metacello BaselineOf and a Rowan configuration This baseline has 3 packages and 2 groups ...
  • 59. … Rowan Con!gurations file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/Core.ston RwProjectLoadConfiguration{ #name : 'Core', #definedGroupNames : { 'Core’ : [], 'Tests’ : [ 'Core’ ] }, #conditionalPackages: { [ 'common' ] : { 'Core': { #packageNames : [ 'RowanSample4-Core', 'RowanSample4-Extensions' ] } }, { 'Tests': { #packageNames : [ 'RowanSample4-Tests' ] } } }, #comment : 'conditional packages' } This is a slightly more complicated configuration implementation than you saw earlier .. In this case we have the platform defined as ‘common’ and packages are directly gathered together into groups. What is missing from Metacello is package dependencies With atomic loads, dependencies aren’t required If package dependencies are needed, a more complicated specification class can be defined to permit it … It’s worth mentioning at this point that an advantage to going with the instance-based approach is that it’s possible to analyze configurations with non-Rowan tools … and configuration implemantations can contain project/dialect specific attributes
  • 60. … Rowan Con!gurations RwProjectLoadConfiguration{ #name : 'Core', #configurationNames : [ 'Test' ], #comment : ‘Platform independent configuration for RowanSample1.' } RwProjectLoadConfiguration{ #name : 'Test', #conditionalPackages: { [ 'common' ] : { 'Tests': { #packageNames : [ 'RowanSample1-Tests’ ] } } }, #configurationNames : [ ‘Common' ], #comment : 'Platform independent Test packages.' } RwProjectLoadConfiguration{ #name : 'Common', #conditionalPackages: { [ 'common' ] : { 'Core': { #packageNames : [ 'RowanSample1-Core', 'RowanSample1-Extensions' ] } } }, #configurationNames : [ ], #comment : 'Platform independent packages' } file:$ROWAN_PROJECTS_HOME/Project/rowan/configs/* The final bit I want to show is that configurations can be nested to provide additional structure for projects that have a large number of packages… Worth noting that that the plan is to display the configuration structures in Jadeite...
  • 61. Rowan/Jadeite Plans (near term) ● Keep our production customer happy ● Implement missing features in both Rowan and Jadeite ● Rowan support in SmalltalkCI ● Port FileSystem and parts of Zinc to GemStone kernel ● Port Rowan to 3.4 – Upgrade path from 3.2.15 to 3.4
  • 62. Rowan/Jadeite Plans (long term) ● Port Rowan to GemStone 3.5 ● Package kernel classes for 3.5/3.6 ● Create a Pharo-based GUI using servicesAPI created for Jadeite ● Integrate Rowan with tODE, GLASS/GsDevKit, GsDevKit_home ● Review/Refactor for dialect portability