Проблемы с TypeScript и TFS

Вероятно, существует проблема с проектом TFS Visual Studio, проведенным вместе с Typescript.

На сборке tsc не может перезаписывать файл .js только для чтения, а throws Permission denied error.

Error   1   Permission denied   
Error   2   The command ""C:\Program Files (x86)\Microsoft SDKs\TypeScript\0.8.0.0\tsc 
"c:\users\schlicht\documents\visual studio 2012\Projects\TypeScriptHTMLApp1\TypeScriptHTMLApp1\app.ts"" exited with code 1. 

Возможно ли без явно проверять файлы на использование сборки с tsc?

Ответ 1

Не проверяйте файл .js. Мы используем этот подход в нашем проекте TypeScript, и он работает хорошо. Нет необходимости иметь сгенерированный .js в исходном управлении; подумайте о файлах .js как о выходе проекта, например,.exe или .dll.

Ответ 2

Теперь, если ваш сервер сборки настроен для запуска Typescript, TSC запустится и сгенерирует файлы JavaScript.

Вот еще одно альтернативное решение, если вы не хотите удалять файл JS. Потому что, если вы удалите JS на какое-то время и любой другой разработчик снова включит эти файлы в TFS, произойдет та же ошибка. (более того, это скрытые файлы, поэтому, если вы не регистрируетесь внимательно, их можно зарегистрировать в TFS)

В этом случае вы можете запустить событие Pre-Build, которое удалит все доступные только для чтения атрибуты файлов JS для этого проекта.

1. Щелкните правой кнопкой мыши на проекте и откройте окно свойств проекта.

2. Выберите вкладку Build Event

enter image description here

Это обеспечит, что все файлы JS освободят атрибуты "Только для чтения", и не будет ошибок при сбое записи в файл.

Надеюсь это поможет.

Источник: http://dailydotnettips.com/2014/05/03/typescript-emit-error-write-to-file-failed-how-to-resolve

Ответ 4

Здесь обходной путь: сохранить ваши JS файлы как часть проекта и в исходном управлении.

Используйте локальную рабочую область, так как это не относится к файлу, доступному только для чтения, поэтому сохранение файлов .JS не требует регистрации для записи.

Я нашел это, потому что я не показывал эту проблему, но другие в моей команде были, поэтому после некоторого рытья я узнал, что было иначе. Я использовал локальную рабочую область вместо рабочей области сервера.

Другие члены команды перешли в локальную рабочую область, и они снова плавно вернутся.

Ответ 5

I испытал вчера.

Как указано в заявлении, не добавляйте сгенерированные .js в TFS; или добавьте tf checkout и tf checkin к цели BeforeBuild.

Ответ 6

В ответ людям, предлагающим исключить .js файлы из проекта, я должен сказать, что это может работать только в малом и единственном программном обеспечении. В большом программном приложении, то есть в ERP, обычно существует несколько решений для каждого модуля, и когда у каждого есть файлы .js для себя, доставка .js и других исходных файлов такого типа обычно производится путем создания им "Embedded Resources" и некоторых пользовательских поставщик виртуального пути или что-то в этом роде.

Итак, что работает? Это решение может помочь вам, я предлагаю вам попробовать.

Но в любом случае, как отметил А. М.. это известная ошибка. И я думаю, что лучшим решением для компилятора TypeScript было бы пропустить записи .js файлов для этих файлов .ts, которые доступны только для чтения (зарегистрировано).

Ответ 7

Проблема:
Если вы добавляете сгенерированные файлы *.js в TFS, то TFS защищает их от записи, если вы регистрируете их или не проверяете их. Поэтому, если вы измените файл *.ts, он не сможет сгенерировать файл *.js, потому что этот файл защищен от записи.
==> Ошибка
Но если вы не отметите их, файл *.js будет отсутствовать, если вы запустите deploy.
==> Компилируется, но ошибка во время выполнения
Кроме того, если вам нужно это как встроенный ресурс, вы не можете исключить файл...

Дополнительная проблема 1:
Если вы запустите "Rebuild Solution", Visual Studio захочет удалить файлы *.js, сгенерированные TypeScript, перед тем как выполнить сборку.
Но удаление невозможно, потому что файлы *.js защищены от записи...
==> Ошибка

Дополнительная проблема 2:
Так как clean не является "Build", события pre-build не выполняются на clean...
Поэтому, если вы удалите защиту от записи при предварительной сборке, она сработает, если вы выполните "сборку", но не получится, если вы выберете "Перестроить", независимо от того, делаете ли вы это в решении или в проекте.

Дополнительная проблема 3:
Вы не можете определить команду предварительной очистки события в редакторе настроек проекта.

Итак, вот что вы можете сделать:
Запустите attrib -r/s (снимает защиту от записи) для ваших машинописных файлов *.js в качестве действия перед сборкой.
например

attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"

Это работает, потому что * расширен:

  • Если файл не существует, ошибки нет, потому что команда не выполняется.
  • Если файл существует, ошибки нет, команда выполняется.

Если вы запустите его с именем файла, произойдет сбой, если файл не существует.

Теперь вам нужно отредактировать файл проекта (*.csproj) вручную, чтобы добавить предварительно очищенное действие.
Действие предварительной очистки аналогично действию предварительной сборки.

  <Target Name="BeforeClean">
    <!-- DO YOUR STUFF HERE -->
    <Exec Command="attrib -r /s &quot;$(ProjectDir)Resources/Scripts/0/*.js&quot;" />
  </Target>

И вот, пожалуйста. Теперь вы можете проверить файлы *.js, отредактировать файл *.ts (вам нужно снять защиту с файла *.js или запустить сборку впоследствии).

Если вы хотите запустить его отдельно для каждого файла, введите команду:

if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)

или в XML-форме:

<Exec Command="if EXIST &quot;$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js&quot; (&#xD;&#xA;attrib -r &quot;$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js&quot;&#xD;&#xA;)" />

И вместо того, чтобы удалять атрибут "только для чтения" оптом в действии перед сборкой, вы также можете проверить отдельные файлы с помощью инструмента командной строки TFS:
"$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout/lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"

Кстати, вы можете найти список макросов VisualStudio/MsBuild здесь:
https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view=vs-2017

И чтобы узнать действительное значение макроса:

  • щелкните правой кнопкой мыши свой проект в обозревателе решений, выберите Свойства
  • выберите вкладку Build Events
  • нажмите кнопку "Изменить до сборки" или "Редактировать после сборки".
  • в появившемся окне нажмите кнопку Макросы
  • прокрутите список вниз, пока не найдете ProjectDir, на следующей панели его фактическое значение