Еще один быстрый и простой способ - использовать Boost.Fusion I/O
:
#include
#include
#include
#include
namespace fusion = boost::fusion;
struct CsvString
{
std::string value;
// Stop reading a string once a CSV delimeter is encountered.
friend std::istream& operator>>(std::istream& s, CsvString& v) {
v.value.clear();
for(;;) {
auto c = s.peek();
if(std::istream::traits_type::eof() == c || ',' == c || '\n' == c)
break;
v.value.push_back(c);
s.get();
}
return s;
}
friend std::ostream& operator<<(std::ostream& s, CsvString const& v) {
return s << v.value;
}
};
int main() {
std::stringstream input("abc,123,true,3.14\n"
"def,456,false,2.718\n");
typedef boost::tuple CsvRow;
using fusion::operator<<;
std::cout << std::boolalpha;
using fusion::operator>>;
input >> std::boolalpha;
input >> fusion::tuple_open("") >> fusion::tuple_close("\n") >> fusion::tuple_delimiter(',');
for(CsvRow row; input >> row;)
std::cout << row << '\n';
}
Выходы:
(abc 123 true 3.14)
(def 456 false 2.718)
Прочитав ответ @ tbking, я нашел файл конфигурации, который работает довольно хорошо.
language: node_js
node_js:
- "stable"
cache:
directories:
- "$HOME/.npm"
matrix:
fast_finish: true
include:
- env: ECMAScript
before_script:
- cd ${TRAVIS_BUILD_DIR}/templates/ECMAScript
- npm install
script:
- npm test
- npm run build
- env: TypeScript
before_script:
- cd ${TRAVIS_BUILD_DIR}/templates/TypeScript
- npm install
script:
- npm test
- npm run build
on:
branch: master
Вы можете добавить все эти шаги в ловушку жизненного цикла, например before_install .
before_install
- cd ./subfolder1
- npm install
- npm test
- npm run build
- cd ./subfolder2
- npm install
- npm test
- npm run build
Вы также можете выполнить тестирование и сборку обоих этих проектов в разделе script
, но идея заключается в том, что вам нужно самостоятельно управлять последовательностью выполняемых действий. Это сделает install
stage просто заполнителем.