{"id":13755143,"url":"https://github.com/willowtreeapps/ukor","last_synced_at":"2025-05-07T08:49:03.742Z","repository":{"id":44174676,"uuid":"92086226","full_name":"willowtreeapps/ukor","owner":"willowtreeapps","description":"A Roku build tool with support for build flavors","archived":false,"fork":false,"pushed_at":"2023-11-09T11:56:38.000Z","size":607,"stargazers_count":50,"open_issues_count":18,"forks_count":13,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-04-22T15:08:43.960Z","etag":null,"topics":["brightscript","build","build-tool","roku"],"latest_commit_sha":null,"homepage":"","language":"Brightscript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/willowtreeapps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-22T18:26:54.000Z","updated_at":"2025-02-22T10:37:15.000Z","dependencies_parsed_at":"2024-08-03T10:02:08.129Z","dependency_job_id":"50056d6e-0f84-40b2-beba-ccb0ec0df140","html_url":"https://github.com/willowtreeapps/ukor","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willowtreeapps%2Fukor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willowtreeapps%2Fukor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willowtreeapps%2Fukor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willowtreeapps%2Fukor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willowtreeapps","download_url":"https://codeload.github.com/willowtreeapps/ukor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252847215,"owners_count":21813436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["brightscript","build","build-tool","roku"],"created_at":"2024-08-03T10:00:47.286Z","updated_at":"2025-05-07T08:49:03.710Z","avatar_url":"https://github.com/willowtreeapps.png","language":"Brightscript","readme":"\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"200px\" height=\"200px\" src=\"artwork/ukor-logo.svg\"/\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\n# Ukor\n\nA build tool for Roku projects\n\nFeatures:\n- Multiple flavors\n- Install to device\n- Project and local configuration properties\n- Save installation targets and authentication details\n- Set default install targets\n- Search for Rokus on your local network\n\n## Questions?\n\nJoin us in the #tooling channel on the [Roku Developers Slack](https://join.slack.com/t/rokudevelopers/shared_invite/enQtMzU5Njc5ODM5MzAyLWE2MTIxMWQ5Nzg0Y2E3ODgzYTk4NmQxMDg2YjRjYjdiMzM5ZDU4ZTc0YmM1ZmU0Mzc5MzI3ODU3MmUxOTdlNTE).\n\n## Requirements\n\n* Node **v7.6** or higher.\n\n## Project setup\n\nYou can install Ukor via NPM.\n\n```sh\nnpm install -g @willowtreeapps/ukor\n```\n\nA Ukor project is organized in a single `src` folder with properties files in order to configure Ukor. The `src` folder contains a single `main` folder which contain the default built sources, optional customized flavor sources as well as test sources.\n\n```\n/Project\n- src/\n  - main/\n    - components/\n    - source/\n    - anyThingYouWant/\n    - constants.yaml\n  - flavor1/\n  - flavor2/\n  - test/\n  - testflavor1/\n- ukor.properties\n- ukor.local\n```\n\nThe `ukor.properties` file is the main ukor configuration  file for the project and should be version controlled. The `ukor.local` file is a local properties file that contains local customizations for ukor overriding the `ukor.properties` file. This file is not expected to be version controlled.\n\nThe `constants.yaml` file is *per-flavor*. In the file, you can define strings (or even any text to insert into a file), and can be identified with `@{some.category.id}` in brightscript OR xml source files.\n\n### Example properties (yaml)\n```yaml\nbuildDir: 'build'\nsourceDir: 'src'\npreBuild: 'scripts/main.js'\nmainFlavor: 'flavorName'\nflavors: {\n  flavorName: {\n    src: ['flavor', 'main']\n  },\n  flavorNameRelease: {\n    base: 'flavorName',\n    src: ['release']\n  }\n}\nrokus: {\n  roku2: {\n    serial: '123123123',\n    auth: {\n      user: 'rokudev',\n      pass: 'YourPassword'\n    }\n  }\n}\n```\n\n## Constants\nEach flavor can contain string resources specified in the `YAML` format by providing `constants.yaml` file. Strings can be referenced by their path specified in any `.xml` or `.brs` source files. For example,\n\nGiven a `constants.yaml` file:\n\n```yml\nstrings:\n  contactSupport: 'contact support at 555-555-5555'\n  login:\n    signIn: 'Sign in now!'\n```\n\nStrings can be references in a `*.brs` file using the following interpolation syntax `@{ \u003cyour_resource_here\u003e }`. For example,\n\n```yml\nsupportLabel.text = \"@{strings.contactSupport}\"\nloginLabel.text = \"@{strings.login.signIn}\"\n```\n\nThe final generated `*.brs` source file will have the strings inlined like so.\n\n```yml\nsupportLabel.text = \"contact support at 555-555-555\"\nloginLabel.text = \"Sign in now!\"\n```\n\n## Usage\n\n```\nUsage: ukor [options] [command]\n\n\n  Commands:\n\n    make [flavors...]             Bundle your channel into a zip to the build directory\n    install [flavor] [roku] [-c]  Bundle then deploy your channel to a named roku\n    package \u003cflavor\u003e \u003croku\u003e       Package a channel flavor with a roku device\n    rekey \u003croku\u003e                  Rekey your device (an packageReference is required)\n    lint \u003cflavor\u003e                 Lint a channel flavor\n    console [roku]                Launch the Telnet console for the named roku\n    debugger [roku]               Launch the Telnet debugger for the named roku\n    find                          Search for rokus on the network\n    init [flavors...]             Initialize a ukor project\n    test                          Run the tests\n    validate                      Validate ukor.properties and ukor.local\n    help [cmd]                    display help for [cmd]\n\n  Options:\n\n    -h, --help     output usage information\n\n    -v, --verbose  Turn on verbose logging\n```\n\n## Quick reference\n\n* I want to make a new project\n```\nukor init\n```\n\n* I want to build my project\n```\nukor make [flavor]\n```\n\n* I want to install my project on a device\n```\nukor install [flavor] [device]\n```\nor\n\n```\nukor install [flavor] [ip address] --auth=[username]:[password]\n```\n\n* I want to package my project using a device\n```\nukor package [flavor] [device]\n```\nor\n\n```\nukor package [flavor] [ip address] --auth=[username]:[password]\n```\n\n* I want to rekey my device\n```\nukor rekey [device]\n```\nor\n\n```\nukor package [ip address] --auth=[username]:[password]\n```\n\nNOTE: you will need to define a `packageReference` and `packageKey` in `ukor.properties.yaml`.\n`packageReference` represent device id and `packageKey` does for password\n\n\n## Testing\n\nUkor uses `UnitTestFramework.brs` as part of its unit test runner and test reporting feature. This is especially useful if you plan on having Continuous Integration as part of your workflow.\n\n### Setup\n\nFirst, copy the modified `UnitTestFramework.brs` in [lib/brs/](../master/lib/brs/UnitTestFramework.brs) to your `src/test/source/` folder, so it loads at startup for when testing.\n\n\u003e Note that the original `UnitTestFramework.brs` can be found [here](https://github.com/rokudev/unit-testing-framework)\n\nNext, dd the following snippet in your startup function, after `screen.show()` but before the event loop\n\n```brightscript\nif params.RunTests = \"true\"\n  runner = TestRunner()\n  if params.host \u003c\u003e invalid\n    runner.logger.SetServer(params.host, params.port)\n  else\n    runner.logger.SetServerURL(params.url)\n  end if\n  ' other setup if needed\n  runner.run()\nend if\n```\n\nYou should now be able to execute your test suite using the `test` command.\n\n```\nukor test [flavor] [roku]\n```\n\n### What's happening?\n\nBasically, we modified the rokudev `UnitTestFramework.brs` file to make a `JSON` of test results, and then `POST` that to the specified server. `ukor test [flavor]` builds and deploys the specified flavor with the `test` src folder, and then restarts the channel with parameters to run tests and point the results to the client machine. `ukor` will log the results, and also output results in `xml` and `junit` format to `.out/tests/ukorTests.[xml|junit]`.\n\nnotes:\n- Ukor now copies `UnitTestFramework.brs` with `ukor init`!\n- `UnitTestFramework.brs` is now up to date with the rokudev repo!\n\n# Contributing to Ukor\n\nContributions and suggestions are more than welcome. Please see our [Code of Conduct](/CODE_OF_CONDUCT.md)\nas well as our [Contributing Guidelines ](/CONTRIBUTING.md) for more information.\n","funding_links":[],"categories":["Build Tools","HarmonyOS","Build Tools, Deployment \u0026 Utility Libraries"],"sub_categories":["Windows Manager","Build Scripts \u0026 Automation"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillowtreeapps%2Fukor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillowtreeapps%2Fukor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillowtreeapps%2Fukor/lists"}